Ist es gültig, mehr als ein Fragezeichen in einer URL zu haben?

90

Ich bin heute auf folgende URL gestoßen:

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

Beachten Sie das doppelte Fragezeichen am Anfang der Abfragezeichenfolge:

??blogid=122&entry_id=64497

Mein Browser schien keine Probleme damit zu haben und führte ein schnelles Lesezeichen aus:

javascript:alert(document.location.search);

Ich habe gerade die oben gezeigte Abfragezeichenfolge erhalten.

Ist das eine gültige URL? Der Grund, warum ich so pedantisch bin (vorausgesetzt, ich bin es), ist, dass ich URLs wie diese für Abfrageparameter analysieren muss und die Unterstützung von doppelten Fragezeichen einige Änderungen an meinem Code erfordern würde. Wenn sie in freier Wildbahn sind, muss ich sie natürlich unterstützen. Ich bin hauptsächlich neugierig, ob es meine Schuld ist, dass ich die URL-Standards nicht genau einhalte, oder ob es sich tatsächlich um eine nicht standardmäßige URL handelt.

Patzer
quelle
Trotzdem musste ich meinen Code trotzdem nicht ändern. Ich habe indexOf()das Fragezeichen verwendet, um die Position des ersten Auftretens zu ermitteln. Dann teile ich die query_parameters bei jedem auf &und dann ihre Name / Wert-Paare bei jedem =.
Bungle

Antworten:

106

Ja, es ist gültig. Nur der erste ? in einer URL hat Bedeutung, nachdem er als wörtliche Fragezeichen behandelt wurde:

Die Abfragekomponente wird durch das erste Fragezeichen ("?") Angegeben und durch ein Zahlenzeichen ("#") oder durch das Ende des URI abgeschlossen.

...

Der Schrägstrich ("/") und das Fragezeichen ("?") Können Daten innerhalb der Abfragekomponente darstellen. Beachten Sie, dass einige ältere, fehlerhafte Implementierungen solche Daten möglicherweise nicht korrekt verarbeiten, wenn sie als Basis-URI für relative Referenzen verwendet werden (Abschnitt 5.1), anscheinend weil sie bei der Suche nach hierarchischen Trennzeichen Abfragedaten nicht von Pfaddaten unterscheiden können. Da Abfragekomponenten häufig verwendet werden, um identifizierende Informationen in Form von "Schlüssel = Wert" -Paaren zu übertragen, und ein häufig verwendeter Wert eine Referenz auf einen anderen URI ist, ist es für die Benutzerfreundlichkeit manchmal besser, eine prozentuale Codierung dieser Zeichen zu vermeiden.

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

Bernstein
quelle
9
Bedeutet das also, dass der erste Abfrageparameter "? Blogid" und nicht "blogid" heißt? Das könnte Spaß machen ...
GalacticCowboy
3
@GalacticCowboy - Ja, das gleiche ist mir gerade eingefallen. Sie haben Recht - Firebug bestätigt, dass der erste Abfrageparameter tatsächlich vorhanden ist ?blogid. Es scheint tatsächlich ein nicht wesentlicher Parameter zu sein, dh die Seite wird mit einer beliebigen Anzahl von Fragezeichen gleich bedient oder der Parameter wird vollständig weggelassen.
Bungle
26

foo?spam=1?&eggs=3Gibt dem Parameter als tangential verwandte Antwort spamden Wert1?

Hilton Shumway
quelle
Ja. falls es keine .htaccessoder ähnliche Tricks gibt. wenn wir ändern foozu script.phpund diesen Antrag stellen script.php?spam=1?&eggs=3dann var_dump($_GET)zeigtarray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe