#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, иногда для удобства использования лучше избегать процентного кодирования этих символов.
Комментарии:
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" }