Est-il valide d'avoir plus d'un point d'interrogation dans une URL?

92

Je suis tombé sur l'URL suivante aujourd'hui:

http://www.sfgate.com/cgi-bin/blogs/inmarin/detail??blogid=122&entry_id=64497

Notez le point d'interrogation doublé au début de la chaîne de requête:

??blogid=122&entry_id=64497

Mon navigateur ne semble pas avoir de problème avec cela et exécute un petit bookmarklet:

javascript:alert(document.location.search);

vient de me donner la chaîne de requête ci-dessus.

Est-ce une URL valide? La raison pour laquelle je suis si pédant (en supposant que je le suis) est que je dois analyser des URL comme celle-ci pour les paramètres de requête, et que la prise en charge des points d'interrogation doublés nécessiterait des modifications de mon code. Évidemment, s'ils sont dans la nature, je devrai les soutenir; Je suis principalement curieux de savoir si c'est ma faute pour ne pas adhérer exactement aux normes d'URL, ou s'il s'agit en fait d'une URL non standard.

Bungle
la source
Heureusement, malgré cela, je n'ai pas eu besoin de changer mon code. J'utilisais indexOf()pour localiser le point d'interrogation, donc il a pris la position de la première occurrence. Ensuite, je divise les query_parameters à chacun &, puis leurs paires nom / valeur à chacun =.
Bungle

Réponses:

108

Oui, c'est valable. Seul le premier ? d'une URL a une signification, les suivants sont traités comme des points d'interrogation littéraux:

Le composant de requête est indiqué par le premier caractère de point d'interrogation ("?") Et terminé par un caractère de signe dièse ("#") ou par la fin de l'URI.

...

Les caractères barre oblique ("/") et point d'interrogation ("?") Peuvent représenter des données dans le composant de requête. Sachez que certaines implémentations plus anciennes et erronées peuvent ne pas gérer correctement ces données lorsqu'elles sont utilisées comme URI de base pour les références relatives (Section 5.1), apparemment parce qu'elles ne parviennent pas à distinguer les données de requête des données de chemin lors de la recherche de séparateurs hiérarchiques. Cependant, comme les composants de requête sont souvent utilisés pour transporter des informations d'identification sous la forme de paires «clé = valeur» et qu'une valeur fréquemment utilisée est une référence à un autre URI, il est parfois préférable d'éviter le codage en pourcentage de ces caractères.

http://tools.ietf.org/html/rfc3986#section-3.4

ambre
la source
9
Cela signifie-t-il que le premier paramètre de requête est nommé "? Blogid" et non "blogid"? Ça pourrait être amusant ...
GalacticCowboy
3
@GalacticCowboy - Ouais, la même chose m'est venue à l'esprit. Vous avez raison - Firebug confirme que le premier paramètre de requête est en fait ?blogid. Il semble en fait être un paramètre non essentiel, c'est-à-dire que la page est servie de la même manière avec un nombre quelconque de points d'interrogation, ou en omettant complètement le paramètre.
Bungle
27

En tant que réponse liée tangentiellement, foo?spam=1?&eggs=3donne au paramètre spamla valeur1?

Hilton Shumway
la source
Oui. au cas où il n'y aurait pas .htaccessou des astuces similaires. si nous changeons fooà script.phpet faire cette demande script.php?spam=1?&eggs=3alors des var_dump($_GET)spectaclesarray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe