Кто-нибудь знает полный список символов, которые можно использовать в GET без кодирования? В данный момент я использую AZ az и 0-9 ... но я ищу, чтобы узнать полный список.
Меня также интересует, будет ли выпущена спецификация для грядущего добавления китайских, арабских URL-адресов (очевидно, что это сильно повлияет на мой вопрос)
!*'();:@&=+$,/?#[]
либо незарезервированнымиA-Za-z0-9_.~-
(или символом процента%
как частью кодировки процента)REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'
чтобы найти строку URL с плохими символами. Может быть, это полезно и для кого-то еще.Ответы:
Из спецификации RFC 1738 :
РЕДАКТИРОВАТЬ: Как правильно указывает @Jukka K. Korpela, этот RFC был обновлен RFC 3986 . Это расширило и прояснило символы, допустимые для хоста, к сожалению, его нелегко скопировать и вставить, но я сделаю все возможное.
В первом согласованном порядке:
источник
A-Za-z0-9_.-~
и зарезервированных символов в начале этого ответа.!*'();:@&=+$,/?#[]
Это может сэкономить время для людейreserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
говорит, что это RFC 3986 незарезервированные символы (раздел 2.3), а также зарезервированные символы (раздел 2.2), если им нужно сохранить свое особое значение. А также символ процента как часть кодировки процента.
источник
The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
Полный список из 66 незарезервированных символов находится в RFC3986, здесь: http://tools.ietf.org/html/rfc3986#section-2.3
Это любой символ в следующем наборе регулярных выражений:
источник
{}^\~
иbacktick
как небезопасные. И RFC3986 перечисляет \ как небезопасные из-за файловой системы. Это средство также{}^
может быть использовано.-
или поместите его в начало или конец класса символов, потому что на[.-~]
самом деле содержит все символы ASCII от 46 до 126.Я проверил это, запросив мой веб-сайт (apache) со всеми доступными символами на моей немецкой клавиатуре в качестве параметра URL:
Они не были закодированы:
Не кодируется после
urlencode()
:Не кодируется после
rawurlencode()
:Примечание: до 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-адреса, содержащие эти символы:
Конечно
?
, он тоже был связан, но только если он использовался один раз.Некоторые люди теперь предлагают использовать только
rawurlencode()
символы, но слышали ли вы когда-нибудь, что у кого-то были проблемы с открытием этих сайтов?Звездочка
http://wayback.archive.org/web/*/http://google.com
Колон
https://en.wikipedia.org/wiki/Wikipedia:About
Плюс
https://plus.google.com/+google
При знаке, двоеточии, запятой и восклицательном знаке
https: //www.google.com/maps/place/USA/@36.2218457, ...
Из-за этого эти символы должны быть пригодны для использования без кодирования без проблем. Конечно, вы не должны использовать
&;
из-за последовательности кодирования, как&
. Эта же причина действительна для того,%
что она используется для кодирования символов в целом. И так=
как он присваивает значение имени параметра.Наконец, я бы сказал, что можно использовать эти незакодированные:
Но если вы ожидаете случайно сгенерированные URL-адреса, вы не должны их использовать
.!
, поскольку они отмечают конец предложения, а некоторые почтовые приложения не будут автоматически связывать последний символ URL-адреса . Пример:источник
+
От сюда
источник
Они перечислены в RFC3986 . См. Собранный ABNF для URI, чтобы увидеть, что разрешено, где и регулярное выражение для анализа / проверки.
источник
RFC3986 определяет два набора символов, которые вы можете использовать в URI:
Зарезервированные персонажи :
:/?#[]@!$&'()*+,;=
Незарезервированные персонажи :
A-Za-z0-9-_.~
источник
Предстоящее изменение касается китайских, арабских доменных имен, а не URI. Интернационализированные URI называются IRI и определены в RFC 3987 . Однако, сказав, что я бы рекомендовал не делать это самостоятельно, а полагаться на существующую протестированную библиотеку, поскольку существует множество вариантов кодирования / декодирования URI и того, что считается безопасным по спецификации, по сравнению с безопасным при реальном использовании (браузеры). ,
источник
Если вы хотите предоставить пользователям особый опыт, вы можете использовать
pushState
для добавления широкого диапазона символов в URL браузера:источник