Page 1 sur 1

Passer des urls complexe (ancres, arguments, ..) dans un get

Posté : 12 déc. 2010, 02:40
par flyfl0
Bonjour à tous,

Une question me taraude, est-il possible de faire ceci :

Code : Tout sélectionner

http://example.com/?url=http://nom.com/?argument1=valeur1&argument2=valeur2&...#ancre-dans-la-page
Autrement dit, est-il possible de récupérer des url complexes via une méthode GET ?

J'essaie de le faire mais ma variable s'arrête toujours après la valeur du premier argument/ancre, il m'est impossible d'enregistrer l'url passée à $_GET['url'].

Donc au lieu d'avoir :

Code : Tout sélectionner

http://nom.com/?argument1=valeur1&argument2=valeur2&...#ancre-dans-la-page
J'ai :

Code : Tout sélectionner

http://nom.com/?argument1=valeur1
Je nage dans le flou pour l'instant :(

Un grand merci d'avance.

Re: Passer des urls complexe (ancres, arguments, ..) dans un get

Posté : 12 déc. 2010, 03:05
par devlop78
Vulgairement,

? est le séparateur entre l'url et les variables à transmettre
& est le séparateur des variables

donc

http://ndd.ext/index.php?arg1=valeur1&arg2=valeur2

On a :

URL : http://ndd.ext/index.php
arg1 : valeur1
arg2 : valeur2

Tout ce qui se trouve dans les variables (ou arguments), doit être "échappé" ou "UrlEncodé". D'ou l'utilisation de l'urlencode() en php, et de escape() en javascript (attention que ce dernier ne supporte pas l'UTF8, on lui préfèrera une autre fonction). Une utilisation encore plus appropriée est ensuite l'écriture, grâce à htmlspecialchars ou htmlentities, de l'url dans le code HTML.

On obtient ainsi au minimum :

echo "<a href=\"http://ndd.ext/index.php?arg1=" . urlencode($valeur1) . "&arg2=" . urlencode($valeur2) . "\">";

Et mieux :

echo "<a href=\"" . htmlentities("http://ndd.ext/index.php?arg1=" . urlencode($valeur1) . "&arg2=" . urlencode($valeur2) . "\"") . ">";

Re: Passer des urls complexe (ancres, arguments, ..) dans un get

Posté : 12 déc. 2010, 03:52
par flyfl0
Bonjour et merci pour ta réponse,

Je crois que le problème ne vient pas de là puisque même quand la valeur des arguments est alphanumérique (ne nécessite pas d'encodage), php s'arrête au premier argument. Exemple :

Code : Tout sélectionner

?url=http://nom.com/?arg1=bonjour&arg2=monde // $_GET['url'] retourne : http://nom.com/?arg1=bonjour
De plus, je n'ai pas de contrôle a priori sur ce qui est soumis au GET.

Re: Passer des urls complexe (ancres, arguments, ..) dans un get

Posté : 12 déc. 2010, 06:44
par moogli
yop,

ce qui t'arrive est normal comme expliqué avant dès que l'on rencontre un & on considère que c'est une autre variable.
Pour t'en convaincre fait un var_dump($_GET); sur un page que tu appel avec cette url.

Il te faut utiliser urlencode afin de ne plus être emmerder avec ça.

par contre je ne comprend pas le htmlentities qui va quand même laisser des & qui traine (par exemple & devient & ...)


@+

Re: Passer des urls complexe (ancres, arguments, ..) dans un get

Posté : 12 déc. 2010, 21:17
par flyfl0
Bonjour moogli et merci pour ta réponse,

Une fois de plus, je crois que le problème vous échappe très certainement à cause d'une mauvaise formulation de ma part.
Je sais comment récupérer un ou plusieurs arguments passé en GET, je connais la syntaxe qui permet de séparer les variables, les différents types d'encodage etc.

Le problème que je rencontre se produit dans un cas précis, celui ou mon seul argument "url" a pour valeur une url complexe (avec des ancres, des arguments, ..). Mon script est à la base d'un système de revue presse qui permet à des membres, en utilisant une api, tu proposer des liens.

L'url a appeler ressemble à ceci : http://nom.tld/?url=[url que le visiteur souhaite soumettre]

Pourquoi GET plutôt que POST ? Car il faut que les visiteurs puissent soumettre une url de la manière qu'ils souhaitent (bash, script en lisp, ..). Certains langages ne permettant pas d'utiliser la méthode HTTP POST, je suis contraint d'utiliser un GET.

Le problème, lorsque des urls complexes sont soumises, PHP s'arrête à la valeur du premier argument (un encodage à posteriori ne changerait rien). Rappelons que dans ce contexte, je n'ai aucun contrôle à priori sur ce qui est soumis.

Exemples qui fonctionnent :

http://nom.tld/?url=http://en.wikipedia.org/wiki/No_Woman,_No_Cry
me retourne http://en.wikipedia.org/wiki/No_Woman,_No_Cry

http://nom.tld/?url=http://google.com
me retourne http://google.com

Exemples qui ne fonctionnent pas :

http://nom.tld/?url=http://google.com/search?client=ubuntu& ... 8&oe=utf-8
me retourne http://google.com/search?client=ubuntu

http://nom.tld/?url=http://solutions-logiciels.com/actualit ... &actu=8651
me retourne http://solutions-logiciels.com/actualit ... r-le-droit

Ma question est donc, est-il possible d'aller contre ce comportement, en forçant d'une manière ou d'une autre php, apache ou que ce soit à considérer tout ce qui se trouve après "?url=" comme un argument à part entière ?

Un tout gand merci d'avance.

Flo.

Re: Passer des urls complexe (ancres, arguments, ..) dans un get

Posté : 12 déc. 2010, 22:06
par stealth35
faut faire un urlencode, tu peux aussi utiliser http_build_query

Re: Passer des urls complexe (ancres, arguments, ..) dans un get

Posté : 12 déc. 2010, 22:45
par moogli
en clair si quelqu'un viens avec une url contenant les séparateur c'est foutu

tu peut aussi regarder du coté $_SERVER["REQUEST_URI"] voir si tu obtient ce que tu souhaite et faire ta moulinette derrière !

@+

Re: Passer des urls complexe (ancres, arguments, ..) dans un get

Posté : 12 déc. 2010, 23:24
par Berzemus
en clair si quelqu'un viens avec une url contenant les séparateur c'est foutu

tu peut aussi regarder du coté $_SERVER["REQUEST_URI"] voir si tu obtient ce que tu souhaite et faire ta moulinette derrière !

@+
Juste ce que j'allais dire, +1 moogli :wink:

Fait un print_r($_SERVER), et émerveille-toi devant ce trésor insoupçonné...