Могут ли какие-либо сегменты пути URI иметь компонент запроса?
В соответствии с Разделом 3.3, Компонент Пути RFC2396 - Унифицированные Идентификаторы Ресурса,
Путь может состоять из последовательности сегментов пути, разделенных одной косой чертой "/". Внутри сегмента пути символы "/", ";", "=" и "?" защищены. Каждый сегмент пути может включать в себя последовательность параметров, обозначенных точкой с запятой ";" персонаж. Параметры не имеют значения для анализа относительных ссылок.
Однако я никогда не видел URL с параметрами запроса ни в одном сегменте, кроме последнего. Поэтому я не уверен, правильно ли я читаю.
Является http://www.url.com/segment1?seg1param1=val1/page.html?pageparam1=val2
действительный URL?
4 ответа
RFC имеет в виду что-то вроде этого:
http://www.example.com/foo/bar;param=value/baz.html
Это можно интерпретировать как путь /foo/bar/baz.html
с параметром param=value
к bar
сегмент. Знаки вопроса не используются.
Обратите внимание, что RFC 2396 был устаревшим в RFC 3986, который опускает спецификацию параметров, специфичных для сегмента, в пользу общего замечания, что реализации могут (и делают) делать разные вещи для встраивания параметров, специфичных для сегмента:
Помимо точечных сегментов в иерархических путях, сегмент пути считается непрозрачным по общему синтаксису. Приложения, генерирующие URI, часто используют зарезервированные символы, разрешенные в сегменте, для разграничения подкомпонентов, специфичных для схемы или обработчика разыменования. Например, зарезервированные символы точки с запятой (";") и равенства ("=") часто используются для разделения параметров и значений параметров, применимых к этому сегменту. Запятая (",") зарезервированный символ часто используется для аналогичных целей. Например, один производитель URI может использовать сегмент, такой как "name;v=1.1", чтобы указать ссылку на версию 1.1 "name", тогда как другой может использовать сегмент, такой как "name,1.1", чтобы указать то же самое. Типы параметров могут быть определены специфичной для схемы семантикой, но в большинстве случаев синтаксис параметра является специфическим для реализации алгоритма разыменования URI.
Когда вы смотрите на грамматику, которая чуть ниже, она написана:
path = [ abs_path | opaque_part ] path_segments = segment *( "/" segment ) segment = *pchar *( ";" param ) param = *pchar pchar = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | ","
Сегмент состоит из pchar и param, а param сам является pchar. Когда мы продолжаем читать, нет абсолютно никакого "?" символ в компонентах символа pchar. Таким образом, параметры не могут иметь "?", И не может быть "?" в сегментах.
Так что я согласен с ответом Эдварда Томсона, который говорит, что "?" только ограничить сегмент запроса и не может использоваться внутри пути.
Я верю, что вы могли бы справиться с этим, и большинство веб-серверов могли бы его обработать, но я не верю, что вы получите ожидаемые результаты. То есть pageparam1=val2 не будет оцениваться.
Если вам нужны такие параметры, вы всегда можете использовать символ # (как сейчас делают многие графические интерфейсы на основе JavaScript).
Согласно моему прочтению RFC 2396, нет. ?
является зарезервированным символом и служит только для разделения сегмента запроса. ?
не допускается ни в пути, ни в сегменте запроса.
В вашем примере первый ?
отмечает начало сегмента запроса. Второй ?
находится внутри сегмента запроса и не разрешен.