Когда, если вообще, должны ли символы, такие как {и} (фигурные скобки), кодироваться в процентах в URL?
Согласно RFC 3986 следующие символы зарезервированы и должны кодироваться в процентах для использования в URI, отличном от их зарезервированного использования::/?#[]@!$&'()*+,;=
Кроме того, он указывает некоторые символы, которые специально не зарезервированы: a-zA-Z0-9\-._~
Кажется очевидным, что обычно следует кодировать зарезервированные символы (для предотвращения неправильной интерпретации), а не кодировать незарезервированные символы (для удобства чтения), но как следует обрабатывать символы, которые не попадают ни в одну из категорий? Например {
а также }
не отображаются ни в одном списке, но они являются стандартными символами ASCII.
Если обратиться к руководству современных браузеров, кажется, что они иногда ведут себя по-разному. Например, рассмотрите вставку URL https://www.google.com/search?q={
в адресную строку веб-браузера:
- Хром 34.0.1847.116 м не меняет его.
- Firefox 28.0 не меняет его.
- Internet Explorer 9.0 не меняет его.
- Safari 5.1.7 меняет его на
https://www.google.com/search?q=%7B
Однако, если вставить https://www.google.com/#q={
(убрав "поиск" и изменив ?
к #
делая символьную часть фрагмента / хеша, а не строки запроса), мы находим, что:
- Chrome 34.0.1847.116 m меняет его на
https://www.google.com/#q=%7B
(через JavaScript) - Firefox 28.0 не меняет его.
- Internet Explorer 9.0 не меняет его.
- Safari 5.1.7 меняет его на
https://www.google.com/#q=%7B
(перед выполнением JavaScript)
Кроме того, при использовании JavaScript для выполнения запроса асинхронно (т.е. с использованием этого примера MDN, измененного для использования URL-адреса ?q={
), URL не кодируется в процентах автоматически. (Я предполагаю, что это потому, что API XMLHttpRequest предполагает, что URL должен быть закодирован / экранирован заранее.)
Я хотел бы (по причине, связанной с причудливым требованием клиента) использовать {
а также }
в части имени URL в URL-адресах без (1) проблем и, в идеале, без (2) создания некрасивых записей в процентах в сетевой панели веб-инспекторов / отладчиков современных браузеров.
1 ответ
(RFC 2396)
Вы должны кодировать любой из неразумных разделов, и RFC дает причину.
дополнительная информация из RFC
Учитывать <
>
#
%
прежде всего любые управляющие символы 00-1F
а также 7F
также помечен как неразумный в RFC: "
{
}
|
\
^
[
]
`
если вы собираетесь разрешить #
чтобы быть в значениях строки запроса, то это особый случай, потому что #
является идентификатором фрагмента URI.
Некоторые символы, которые не нужно кодировать, принимаются либо закодированными, либо не такими, как ~
Есть 2 общепринятых кодировки для (пространство)
%20
а также +
Вот скрипка с некоторыми тестовыми примерами, которые я использую.