Почему некоторые строки запроса работают, даже если параметры не закодированы в URL?

Вот пример:

https://drive.google.com/viewerng/viewer?embedded=true&url=http://journals.plos.org/plosone/s/file?id=wjVg/PLOSOne_formatting_sample_main_body.pdf

url параметр, http://journals.plos.org/plosone/s/file?id=wjVg/PLOSOne_formatting_sample_main_body.pdf, не кодируется. Он содержит зарезервированные символы, такие как двоеточие, косые черты и знак вопроса.

Почему это все еще работает? И зачем кодировать, если оно работает без него?

3 ответа

Зарезервированные символы URI в основном используются в качестве разделителей - это не означает, что они не могут быть использованы, это только означает, что они имеют специальное назначение, и если они вам не нужны для этой цели, вы должны процентов кодировать их.

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

Стандарт URI RFC 3986 определяет, что компонент запроса может содержать следующие символы:

  • a-z, A-Z
  • 0-9
  • /?:@!$&'()*+,;=-._~
  • символы в процентах

Это даже явно упоминает:

Косая черта ("/") и знак вопроса ("?") Могут представлять данные в компоненте запроса.


Компонент запроса вашего примера URI таков:

embedded=true&url=http://journals.plos.org/plosone/s/file?id=wjVg/PLOSOne_formatting_sample_main_body.pdf

Помимо писем, он содержит =, &, :, /, ., ?, _все из которых разрешены в запросе.

Обратите внимание, что name=value формат (разделенный &) в компоненте запроса это просто соглашение, а не то, что определено в спецификации.

Поскольку в URL некоторые символы имеют особое значение, для отделения пути от запроса используется знак вопроса (?), А амперсанд (&) используется в качестве разделителя между парами ключ-значение. Поэтому для таких символов, как если бы мы использовали их в качестве значения в строке запроса, которую запутал бы браузер, мы используем кодирование, чтобы быть уверенными, что данные не являются неоднозначными. Все показанные вами символы не обрабатываются неоднозначно, так как они используются в допустимых местах в соответствии со схемой http URL.

Это из соответствующего RFC, 1738:

https://www.ietf.org/rfc/rfc1738.txt

3.3. HTTP

Схема HTTP URL используется для обозначения интернет-ресурсов
доступно через HTTP (протокол передачи гипертекста).

Протокол HTTP указан в другом месте. Эта спецификация только
описывает синтаксис HTTP-URL.

URL-адрес HTTP принимает форму:

  http://<host>:<port>/<path>?<searchpart>

где и как описано в разделе 3.1. Если: опущено, по умолчанию используется порт 80. Имя пользователя или пароль не установлены.
позволил. <path> является селектором HTTP, и <searchpart> это запрос
строка. <path> не является обязательным, как и <searchpart> И его
предшествующий "?" Если ни <path> ни<searchpart> присутствует, "/" также может быть опущено.

В пределах <path> а также <searchpart> компоненты, "/", ";", "?" являются
зарезервированный. Символ "/" может использоваться в HTTP для обозначения
иерархическая структура.

Специальные символы в "http://" применяются только к спецификации "protocol" в начале URL. Это необязательно в большинстве браузеров (неявно "http://").

Первый "?" отделяет "путь" от "searchpart". Каждый "&" разделяет различные аргументы в "searchpart".

Ваш браузер должен различать ?embedded=true а также &url=http://www.pdf995.com/samples/pdf.pdf,

'Надеюсь, это поможет

Другие вопросы по тегам