Символы разрешены в URL - PullRequest
       51

Символы разрешены в URL

172 голосов
/ 07 декабря 2009

Кто-нибудь знает полный список символов, которые можно использовать в GET без кодирования? На данный момент я использую A-Z a-z и 0-9 ... но я ищу, чтобы узнать полный список.

Меня также интересует, будет ли выпущена спецификация для предстоящего добавления китайских, арабских URL-адресов (очевидно, что это сильно повлияет на мой вопрос)

Ответы [ 8 ]

163 голосов
/ 07 декабря 2009

С RFC 1738 Технические характеристики:

Таким образом, только буквенно-цифровые символы, специальные символы "$-_.+!*'()," и зарезервированные символы, используемые в зарезервированных целях, могут быть использованы незакодированный внутри URL.

РЕДАКТИРОВАТЬ: Как правильно указывает @Jukka K. Korpela, этот RFC был обновлен на RFC 3986 . Это расширило и прояснило символы, допустимые для хоста, к сожалению, его нелегко скопировать и вставить, но я сделаю все возможное.

В первом согласованном порядке:

host        = IP-literal / IPv4address / reg-name

IP-literal  = "[" ( IPv6address / IPvFuture  ) "]"

IPvFuture   = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )

IPv6address =         6( h16 ":" ) ls32
                  /                       "::" 5( h16 ":" ) ls32
                  / [               h16 ] "::" 4( h16 ":" ) ls32
                  / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
                  / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
                  / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   ls32
                  / [ *4( h16 ":" ) h16 ] "::"              ls32
                  / [ *5( h16 ":" ) h16 ] "::"              h16
                  / [ *6( h16 ":" ) h16 ] "::"

ls32        = ( h16 ":" h16 ) / IPv4address
                  ; least-significant 32 bits of address

h16         = 1*4HEXDIG 
               ; 16 bits of address represented in hexadecimal

IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet

dec-octet   = DIGIT                 ; 0-9
              / %x31-39 DIGIT         ; 10-99
              / "1" 2DIGIT            ; 100-199
              / "2" %x30-34 DIGIT     ; 200-249
              / "25" %x30-35          ; 250-255

reg-name    = *( unreserved / pct-encoded / sub-delims )

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"     <---This seems like a practical shortcut, most closely resembling original answer

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

pct-encoded = "%" HEXDIG HEXDIG
41 голосов
/ 07 декабря 2009

Символы, разрешенные в URI, являются зарезервированными или незарезервированными (или символом процента как частью кодировки процента)

http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters

говорит, что это RFC 3986 незарезервированные символы (с. 2.3), а также зарезервированные символы (с. 2.2), если им необходимо сохранить свое особое значение , А также символ процента в кодировке процента.

21 голосов
/ 19 декабря 2012

Полный список из 66 незарезервированных символов приведен в RFC3986, здесь: http://tools.ietf.org/html/rfc3986#section-2.3

Это любой символ из следующего набора регулярных выражений:

[A-Za-z0-9_.\-~]
12 голосов
/ 17 февраля 2017

Я проверил это, запросив мой сайт (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,...

Из-за этого эти символы должны быть пригодны для использования без кодирования без проблем. Конечно, вы не должны использовать &; из-за кодирующих последовательностей, таких как &amp;. Для % действует та же причина, что и для кодирования символов в целом. И =, поскольку он присваивает значение имени параметра.

Наконец, я бы сказал, что можно использовать эти незакодированные:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@

Но если вы ожидаете случайно сгенерированные URL-адреса, вы не должны использовать .!, потому что они отмечают конец предложения, и некоторые почтовые приложения не будут автоматически связывать последний символ URL-адреса. Пример:

Visit http://example.com/foo=bar! !
12 голосов
/ 07 декабря 2009

С здесь

Таким образом, только буквенно-цифровые символы, специальные символы $-_.+!*'(), и зарезервированные символы, используемые для их Зарезервированные цели могут быть использованы незакодированными внутри URL.

7 голосов
/ 07 декабря 2009

Они перечислены в RFC3986 . См. Собранные ABNF для URI , чтобы увидеть, что разрешено, где и регулярное выражение для анализа / проверки.

3 голосов
/ 28 декабря 2016

RFC3986 определяет два набора символов, которые вы можете использовать в URI:

  • Зарезервированные символы : :/?#[]@!$&'()*+,;=

    зарезервировано = общие-под-разделы / под-разделы

    gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"

    sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

    Назначение зарезервированных символов - предоставить набор символов-разделителей, которые можно отличить от других данных в URI. URI, которые отличаются заменой зарезервированного символа его соответствующим октетом в процентах, не эквивалентны.

  • Незарезервированные символы : A-Za-z0-9-_.~

    незарезервировано = АЛЬФА / ЦИФРА / "-" / "." / "_" / "~"

    Символы, которые разрешены в URI, но не имеют зарезервированной цели, называются незарезервированными.

3 голосов
/ 07 декабря 2009

Предстоящее изменение касается китайских, арабских доменных имен, а не URI. Интернационализированные URI называются IRI и определены в RFC 3987 . Однако, сказав, что я бы рекомендовал не делать это самостоятельно, а полагаться на существующую протестированную библиотеку, поскольку существует множество вариантов кодирования / декодирования URI и того, что считается безопасным по спецификации, по сравнению с безопасным при реальном использовании (браузеры). .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...