2010-05-27 16 views
68

mi sono imbattuto nel seguente URL oggi:È valido avere più di un punto interrogativo in un URL?

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

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

??blogid=122&entry_id=64497 

Il mio browser non sembrano avere alcun problema con esso, ed eseguendo un bookmarklet rapido:

javascript:alert(document.location.search); 

mi ha appena fornito la stringa di query sopra riportata.

È un URL valido? Il motivo per cui sono così pedante (presumendo che lo sia) è perché ho bisogno di analizzare URL come questo per i parametri di ricerca, e il supporto di punti interrogativi raddoppiati richiederebbe alcune modifiche al mio codice. Ovviamente se sono in libertà, ho bisogno di sostenerli; Sono principalmente curioso di sapere se è colpa mia se non aderisco agli standard URL esattamente, o se è in realtà un URL non standard.

+0

Fortunatamente, nonostante questo non ho avuto bisogno di cambiare il mio codice. Stavo usando 'indexOf()' per localizzare il punto interrogativo, quindi ha rilevato la posizione della prima occorrenza. Quindi sto suddividendo i parametri query_parameters in corrispondenza di '&' e quindi le loro coppie nome/valore in corrispondenza di '='. – Bungle

risposta

81

Sì, è valido. Solo il prima? in un URL ha un significato, qualsiasi dopo che sono trattati come letterali punti interrogativi:

La componente di query è indicato dal il segno prima domanda ("?") carattere e terminato da una numero segno ("#") carattere o entro la fine di l'URI.

...

I caratteri slash ("/") e punto interrogativo ("?") Può rappresentare i dati all'interno del componente di query. Attenzione che alcuni, errate implementazioni più anziani non possono gestire tali dati correttamente quando viene utilizzato come URI di base per i riferimenti relativi (paragrafo 5.1), apparentemente perché non riescono a distinguere i dati query da dati percorso quando alla ricerca di separatori gerarchici. Tuttavia, come componenti di query vengono spesso utilizzati per trasporta informazioni di identificazione nel forma di "chiave = valore" coppie e uno valore utilizzato di frequente è un riferimento a un altro URI, a volte è meglio di usabilità evitare cento -encoding di quei personaggi.

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

+7

Ciò significa che il primo parametro di query è denominato "? Blogid" e non "blogid"? Potrebbe essere divertente ... – GalacticCowboy

+0

Interessante, grazie Ambra - ottima risposta! – Bungle

+2

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

15

come una risposta correlata tangenzialmente, foo?spam=1?&eggs=3 dà il parametro spam il valore 1?