Когда, если когда-либо, символы, подобные {и} (фигурные скобки), кодируются процентами в URL-адресах?

Согласно RFC 3986, следующие символы зарезервированы и должны быть закодированы в процентах, чтобы использоваться в URI, кроме как их зарезервированное использование: :/?#[]@!$&'()*+,;=

Кроме того, он указывает некоторые символы, которые явно не защищены: a-zA-Z0-9\-._~

Кажется очевидным, что обычно нужно кодировать зарезервированные символы (чтобы предотвратить неправильное толкование), а не кодировать незарезервированные символы (для удобства чтения), но как следует обрабатывать символы, которые не попадают ни в одну категорию?. пример { и } не отображаются в любом списке, но они являются стандартными символами ASCII.

Глядя на современные браузеры для руководства, кажется, что они иногда имеют разные типы поведения. Например, рассмотрите вставку URL https://www.google.com/search?q={ в адресную строку веб-браузера:

  • Chrome 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-адресов имен файлов без (1) нарушения вещей и в идеале и без (2) создания уродливых процентов -кодированные записи в сетевой панели веб-инспекторов/отладчиков современных браузеров.

+9
источник поделиться
1 ответ

(RFC 2396)

Вы должны кодировать любой неразумный раздел, а rfc дает причину.


дополнительная информация из RFC

Учет для < > # % в первую очередь любые управляющие символы 00-1F и 7F

также отмечен как неразумный в rfc: " { } | \ ^ [ ] `

если вы намереваетесь разрешить # находиться в значениях запроса, тогда это особый случай, поскольку # является идентификатором фрагмента ури.

Некоторые символы, которые не должны быть закодированы, принимаются либо закодированными, либо не такими, как ~

Существует 2 общепринятых кодировки для (пробел) %20 и +

Здесь сценарий с некоторыми из тестовых примеров, которые я использую.

+3
источник

Посмотрите другие вопросы по меткам или Задайте вопрос