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

#javascript #http

#url #синтаксический анализ #строка запроса

Вопрос:

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

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

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

 ??blogid=122amp;entry_id=64497
  

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

 javascript:alert(document.location.search);
  

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

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

Комментарии:

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

Ответ №1:

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

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

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

https://www.rfc-editor.org/rfc/rfc3986#section-3.4

Комментарии:

1. Значит ли это, что первый параметр запроса называется «?blogid», а не «blogid»? Это может быть весело…

2. @GalacticCowboy — Да, то же самое только что пришло мне в голову. Вы правы — Firebug подтверждает, что первый параметр запроса на самом деле ?blogid . На самом деле это, по-видимому, несущественный параметр, т. Е. Страница обслуживается одинаково с любым количеством вопросительных знаков или полностью пропускает параметр.

Ответ №2:

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

Комментарии:

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