Почему некоторые строки запроса работают, даже если параметры не закодированы в URL?
Вот пример:
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
,
'Надеюсь, это поможет