Мне известно, что +
в строке запроса URL-адреса указан пробел. Это также имеет место за пределами области строки запроса? То есть, делает следующий URL:
http://a.com/a+b/c
на самом деле представляют:
http://a.com/a b/c
(и, следовательно, должны быть закодированы, если это действительно должно быть +
), или это на самом деле представляет a+b/c
?
url
encoding
query-string
Франсиско Райан Толмаски I
источник
источник
rawurldecode
. Я говорю это здесь для справки, потому что это высокий результат в поиске Google для "php url decode breaks on plus symbol".Ответы:
+
символы в компоненте path должны обрабатываться буквально.Чтобы быть явным:
+
это только специальный символ в компоненте запроса.источник
+
символ интерпретируется как пробел в компоненте запроса? Или это просто правило "с дикой природы"?http:
), Authority (//server.example.com
) и Path (/myfile/mypage.htm
) и не определяет никакого специального значения для+
символа. Спецификация HTML определяет компонент запроса как mime-тип application / x-www-form-urlencoded, который определяется как «заменить пробелы+
и другие специальные символы, как в RFC1738». Так что это не "из дикой природы", а из принятого (не RFC) стандарта.Server.UrlEncode
ошибочно кодирует пробелы как плюсы в части пути, нарушая правила HTTP.Вы можете найти хороший список соответствующих символов в кодировке URL на W3Schools .
+
становится%2B
%20
источник
%25252B
Пробел может быть закодирован как «+» только в одном контексте: пары ключ-значение application / x-www-form-urlencoded.
RFC-1866 (спецификация HTML 2.0), пункт 8.2.1. в подпункте 1. говорится: «Имена и значения полей формы экранируются: пробельные символы заменяются на« + », а затем зарезервированные символы экранируются»).
Вот пример такой строки в URL, где RFC-1866 позволяет кодировать пробелы в виде плюсов: « http://example.com/over/there?name=foo+bar ». Таким образом, только после «?» Пробелы можно заменить на плюсы (в других случаях пробелы следует кодировать в% 20). Этот способ кодирования данных формы также приведен в более поздних спецификациях HTML, например, ищите соответствующие параграфы о application / x-www-form-urlencoded в HTML 4.01 Specification и так далее.
Но так как всегда трудно правильно определить контекст, лучше никогда не кодировать пробелы как «+». Лучше кодировать все символы в процентах, кроме «незарезервированных», определенных в RFC-3986, p.2.3. Вот пример кода, который иллюстрирует то, что должно быть закодировано. Он дан на языке программирования Delphi (паскаль), но очень легко понять, как он работает для любого программиста, независимо от того, какой язык он обладает:
источник
используйте функцию encodeURIComponent для исправления URL, она работает в браузере и node.js
источник
Попробуйте ниже:
источник
escape
не рекомендуется, вместо этого вы должны использоватьencodeURI
или в случае части запросаencodeURIComponent
. Также строка параметров должна кодироваться в соответствии с w3c .Ты всегда будешь кодировать URL.
Вот как Ruby кодирует ваш URL:
источник