Я проверил это, запросив мой сайт (apache) со всеми доступными символами на моей немецкой клавиатуре в качестве параметра URL:
http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~
Они не были закодированы:
^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~
Не кодируется после urlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_
Не кодируется после rawurlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~
Примечание: до PHP 5.3.0 rawurlencode()
кодируется ~
из-за RFC 1738 . Но это было заменено на RFC 3986 , так что теперь его безопасно использовать. Но я не понимаю, почему, например, {}
кодируются через rawurlencode()
, потому что они не упомянуты в RFC 3986.
Дополнительный тест, который я провел, касался автоматического связывания в почтовых текстах. Я протестировал Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de и yahoo.de, и они полностью связали URL-адреса, содержащие эти символы:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@
Конечно, ?
тоже был связан, но только если он использовался один раз.
Некоторые люди теперь предлагают использовать только символы rawurlencode()
, но слышали ли вы когда-нибудь, что у кого-то возникли проблемы с открытием этих сайтов?
Звездочка
http://wayback.archive.org/web/*/http://google.com
Colon
https://en.wikipedia.org/wiki/Wikipedia:About
Plus
https://plus.google.com/+google
На знаке, двоеточии, запятой и восклицательном знаке
https://www.google.com/maps/place/USA/@36.2218457,...
Из-за этого эти символы должны быть пригодны для использования без кодирования без проблем. Конечно, вы не должны использовать &;
из-за кодирующих последовательностей, таких как &
. Для %
действует та же причина, что и для кодирования символов в целом. И =
, поскольку он присваивает значение имени параметра.
Наконец, я бы сказал, что можно использовать эти незакодированные:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@
Но если вы ожидаете случайно сгенерированные URL-адреса, вы не должны использовать .!
, потому что они отмечают конец предложения, и некоторые почтовые приложения не будут автоматически связывать последний символ URL-адреса. Пример:
Visit http://example.com/foo=bar! !