É válido ter mais de um ponto de interrogação em um URL?

91

Encontrei o seguinte URL hoje:

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

Observe o ponto de interrogação duplo no início da string de consulta:

??blogid=122&entry_id=64497

Meu navegador não parecia ter nenhum problema com ele e executando um bookmarklet rápido:

javascript:alert(document.location.search);

acabou de me fornecer a string de consulta mostrada acima.

Este é um URL válido? Estou sendo tão pedante (supondo que seja) porque preciso analisar URLs como essa para obter parâmetros de consulta, e o suporte a pontos de interrogação duplicados exigiria algumas alterações em meu código. Obviamente, se eles estiverem na selva, terei de apoiá-los; Estou curioso principalmente para saber se é minha culpa por não aderir aos padrões de URL exatamente, ou se é de fato um URL não padrão.

Estragar
fonte
Felizmente, apesar disso, não precisei alterar meu código. Eu estava usando indexOf()para localizar o ponto de interrogação, então ele pegou a posição da primeira ocorrência. Em seguida, estou dividindo os query_parameters em cada um &e, em seguida, seus pares nome / valor em cada um =.
Bungle de

Respostas:

107

Sim, é válido. Apenas o primeiro ? em um URL tem significado, depois de tratado como ponto de interrogação literal:

O componente de consulta é indicado pelo primeiro caractere de ponto de interrogação ("?") E terminado por um caractere de sinal numérico ("#") ou pelo final do URI.

...

Os caracteres barra ("/") e ponto de interrogação ("?") Podem representar dados dentro do componente de consulta. Esteja ciente de que algumas implementações errôneas mais antigas podem não manipular esses dados corretamente quando são usados ​​como URI de base para referências relativas (Seção 5.1), aparentemente porque eles falham em distinguir os dados da consulta dos dados do caminho ao procurar separadores hierárquicos. No entanto, como os componentes de consulta são frequentemente usados ​​para transportar informações de identificação na forma de pares "chave = valor" e um valor usado com frequência é uma referência a outro URI, às vezes é melhor para usabilidade evitar a codificação percentual desses caracteres.

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

Âmbar
fonte
9
Isso significa que o primeiro parâmetro de consulta é denominado "? Blogid" e não "blogid"? Isso pode ser divertido ...
GalacticCowboy
3
@GalacticCowboy - Sim, a mesma coisa acabou de me ocorrer. Você está correto - o Firebug confirma que o primeiro parâmetro de consulta é de fato ?blogid. Na verdade, parece ser um parâmetro não essencial, ou seja, a página é exibida da mesma forma, com qualquer número de pontos de interrogação lá, ou omitindo o parâmetro totalmente.
Bungle de
26

Como uma resposta tangencialmente relacionada, foo?spam=1?&eggs=3dá ao parâmetro spamo valor1?

Hilton Shumway
fonte
sim. caso não haja .htaccesstruques ou truques semelhantes. se mudarmos foopara script.phpe fizermos essa solicitação script.php?spam=1?&eggs=3, var_dump($_GET)mostraráarray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe