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

Сегодня я наткнулся на следующий 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-адрес.


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


Ответы (2)


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

Компонент запроса обозначается первым символом вопросительного знака ("?") и завершается знаком номера ("#") или концом URI.

...

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

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

person Amber    schedule 27.05.2010
comment
Значит ли это, что первый параметр запроса называется ?blogid, а не blogid? Это может быть весело... - person GalacticCowboy; 27.05.2010
comment
@GalacticCowboy - Да, мне только что пришло в голову то же самое. Вы правы - Firebug подтверждает, что первый параметр запроса на самом деле ?blogid. На самом деле это необязательный параметр, т. е. страница обслуживается одинаково с любым количеством вопросительных знаков или с полным отсутствием параметра. - person Bungle; 27.05.2010

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

person Hilton Shumway    schedule 17.02.2016
comment
да. на случай, если нет .htaccess или подобных ухищрений. если мы изменим foo на script.php и сделаем этот запрос script.php?spam=1?&eggs=3, то var_dump($_GET) покажет array(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" } - person Hebe; 02.07.2020