Допустимо ли иметь в URL более одного вопросительного знака?

92

Сегодня я наткнулся на следующий URL:

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

Обратите внимание на двойной вопросительный знак в начале строки запроса:

??blogid=122&entry_id=64497

У моего браузера, похоже, не было никаких проблем с этим, и я запустил быстрый букмарклет:

javascript:alert(document.location.search);

просто дал мне строку запроса, показанную выше.

Это действительный URL? Причина, по которой я такой педантичный (предполагая, что это так), заключается в том, что мне нужно анализировать такие URL-адреса для параметров запроса, а поддержка двойных вопросительных знаков потребует некоторых изменений в моем коде. Очевидно, если они в дикой природе, мне нужно будет их поддержать; Мне в основном любопытно, виновата ли я в том, что не придерживаюсь точных стандартов URL, или это на самом деле нестандартный URL.

Bungle
источник
К счастью, несмотря на это, мне не пришлось менять код. Я использовал, indexOf()чтобы найти вопросительный знак, поэтому он взял позицию первого появления. Затем я разделяю query_parameters на каждую, &а затем их пары имя / значение для каждой =.
Bungle

Ответы:

108

Да, это действительно так. Значение имеет только первое ? в URL-адресе, все после него рассматриваются как буквальные вопросительные знаки:

Компонент запроса обозначается первым знаком вопроса («?») И заканчивается знаком числа («#») или концом URI.

...

Символы косой черты («/») и вопросительного знака («?») Могут представлять данные в компоненте запроса. Помните, что некоторые старые ошибочные реализации могут некорректно обрабатывать такие данные, когда они используются в качестве базового URI для относительных ссылок (раздел 5.1), по-видимому, потому, что они не могут отличить данные запроса от данных пути при поиске иерархических разделителей. Однако, поскольку компоненты запроса часто используются для передачи идентифицирующей информации в форме пар «ключ = значение», а одно часто используемое значение является ссылкой на другой URI, иногда для удобства использования лучше избегать процентного кодирования этих символов.

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

Янтарь
источник
9
Значит ли это, что первый параметр запроса называется «? Blogid», а не «blogid»? Это может быть весело ...
GalacticCowboy
3
@GalacticCowboy - Да, мне в голову пришло то же самое. Вы правы - Firebug подтверждает, что первый параметр запроса действительно ?blogid. На самом деле это кажется несущественным параметром, т.е. страница обслуживается одинаково, с любым количеством вопросительных знаков или без параметра полностью.
Bungle
27

В качестве косвенно связанного ответа foo?spam=1?&eggs=3дает параметру spamзначение1?

Хилтон Шамуэй
источник
да. в случае отсутствия .htaccessили подобных уловок. если мы изменим fooна script.phpи сделаем этот запрос, script.php?spam=1?&eggs=3то var_dump($_GET)покажетarray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe