È valido avere più di un punto interrogativo in un URL?


92

Oggi mi sono imbattuto nel seguente URL:

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

Notare il punto interrogativo raddoppiato all'inizio della stringa di query:

??blogid=122&entry_id=64497

Il mio browser non sembra avere problemi con esso ed esegue un rapido bookmarklet:

javascript:alert(document.location.search);

mi ha appena dato la stringa di query mostrata sopra.

È un URL valido? Il motivo per cui sono così pedante (supponendo che lo sia) è perché ho bisogno di analizzare URL come questo per i parametri di query e supportare i punti interrogativi doppi richiederebbe alcune modifiche al mio codice. Ovviamente se sono allo stato brado, dovrò supportarli; Sono principalmente curioso se è colpa mia se non aderisco esattamente agli standard URL o se in realtà è un URL non standard.


Fortunatamente, nonostante questo non ho avuto bisogno di cambiare il mio codice. Stavo usando indexOf()per individuare il punto interrogativo, quindi ha rilevato la posizione della prima occorrenza. Quindi divido i parametri_query in ciascuno &e poi le loro coppie nome / valore in ciascuno =.
Bungle

Risposte:


108

Sì, è valido. Solo il primo ? in un URL ha un significato, tutti quelli dopo che vengono trattati come punti interrogativi letterali:

Il componente della query è indicato dal primo carattere punto interrogativo ("?") E termina con un carattere numerico ("#") o dalla fine dell'URI.

...

I caratteri barra ("/") e punto interrogativo ("?") Possono rappresentare dati all'interno del componente query. Fai attenzione che alcune implementazioni più vecchie ed errate potrebbero non gestire correttamente tali dati quando vengono utilizzati come URI di base per i riferimenti relativi (Sezione 5.1), apparentemente perché non riescono a distinguere i dati della query dai dati del percorso quando si cercano separatori gerarchici. Tuttavia, poiché i componenti di query vengono spesso utilizzati per trasportare informazioni di identificazione sotto forma di coppie "chiave = valore" e un valore utilizzato di frequente è un riferimento a un altro URI, a volte è meglio per l'usabilità evitare la codifica percentuale di tali caratteri.

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


9
Quindi questo significa che il primo parametro di query è denominato "? Blogid" e non "blogid"? Potrebbe essere divertente ...
GalacticCowboy

3
@GalacticCowboy - Sì, la stessa cosa mi è appena venuta in mente. Hai ragione - Firebug conferma che il primo parametro di query è effettivamente ?blogid. In realtà sembra essere un parametro non essenziale, cioè la pagina è servita allo stesso modo con un numero qualsiasi di punti interrogativi o omettendo completamente il parametro.
Bungle

27

Come risposta tangenzialmente correlata, foo?spam=1?&eggs=3dà al parametro spamil valore1?


sì. nel caso in cui non ci siano .htaccesstrucchi o simili. se cambiamo fooper script.phpe facciamo questa richiesta script.php?spam=1?&eggs=3poi var_dump($_GET)spettacoliarray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.