Могут ли какие-либо сегменты пути URI иметь компонент запроса? - PullRequest
7 голосов
/ 22 июня 2011

Согласно Разделу 3.3, Компонент пути из RFC2396 - Унифицированные идентификаторы ресурсов ,

Путь может состоять из последовательности сегментов пути, разделенных одной косой чертой "/". В пределах сегмента пути символы "/", ";", "=" и "?" зарезервированы Каждый сегмент пути может включать в себя последовательность параметров, обозначенных точкой с запятой ";" персонаж. Параметры не имеют значения для анализа относительных ссылок.

Однако я никогда не видел URL с параметрами запроса ни в одном сегменте, кроме последнего. Поэтому я не уверен, правильно ли я читаю.

Является ли http://www.url.com/segment1?seg1param1=val1/page.html?pageparam1=val2 действительным URL-адресом?

Ответы [ 4 ]

10 голосов
/ 01 июля 2011

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.

1 голос
/ 30 июня 2011

Когда вы смотрите на грамматику чуть ниже, там написано:

  path          = [ abs_path | opaque_part ]

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param )
  param         = *pchar

  pchar         = unreserved | escaped |
                  ":" | "@" | "&" | "=" | "+" | "$" | ","

Сегмент состоит из pchar и param, а param сам по себе pchar.Когда мы продолжаем читать, нет абсолютно никакого «?»символ в компонентах символа pchar.Таким образом, параметры не могут иметь "?", И не может быть "?"в сегментах.

Так что я согласен с ответом Эдварда Томсона, который говорит, что "?"только ограничить сегмент запроса и не может использоваться внутри пути.

0 голосов
/ 30 июня 2011

Я полагаю, что вы могли бы справиться с этим, и большинство веб-серверов могли бы его обработать, но я не верю, что вы получите ожидаемые результаты.То есть pageparam1 = val2 не будет оцениваться.

Если вам нужны такие параметры, вы всегда можете использовать символ # (как это делают многие GUI на основе JavaScript).

0 голосов
/ 30 июня 2011

Согласно моему прочтению RFC 2396, нет .? является зарезервированным символом и служит только для разделения сегмента запроса.? недопустимо ни в пути, ни в сегменте запроса.

В вашем примере первый ? отмечает начало сегмента запроса.Второй ? находится внутри сегмента запроса и не разрешен.

...