Когда, если вообще, должны ли символы, такие как {и} (фигурные скобки), кодироваться в процентах в 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 а также +

Вот скрипка с некоторыми тестовыми примерами, которые я использую.

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