web-dev-qa-db-fra.com

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

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

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

Remarquez 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 bookmarklet rapide:

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 parce que j'ai besoin d'analyser des URL comme celle-ci pour les paramètres de requête, et la prise en charge des points d'interrogation doublés nécessiterait quelques modifications dans mon code. Évidemment, s'ils sont à l'état sauvage, je devrai les soutenir; Je suis surtout curieux de savoir si c'est ma faute de ne pas avoir respecté exactement les normes d'URL ou s'il s'agit en fait d'une URL non standard.

83
Bungle

Oui, c'est valable. Seul le en premier ? dans une URL a une signification, toutes après avoir été traitées 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 numérique ("#") ou par la fin de l'URI.

...

La barre oblique ("/") et le point d'interrogation ("?") Peuvent représenter des données dans le composant de requête. Gardez à l'esprit que certaines implémentations 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 pour la facilité d'utilisation d'éviter de coder en pourcentage ces caractères.

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

98
Amber

Comme réponse tangentiellement liée, foo?spam=1?&eggs=3 donne le paramètre spam la valeur 1?

22
Hilton Shumway