Символы, разрешенные в URL-адресе


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

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

8 153
url

8 ответов:

С RFC 1738 спецификация:

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

редактировать: как @юкка корпела К. правильно указывает, в этом документе был обновлен 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

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

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

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

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

- Это любой символ в следующем наборе:

[A-Za-z0-9_.-~]

С здесь

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

я протестировал его, запросив мой сайт (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() chars, но вы когда-нибудь слышали, что у кого-то были проблемы, чтобы открыть эти веб-сайты?

Asterisk
http://wayback.archive.org/web/*/http://google.com

Colon
https://en.wikipedia.org/wiki/Wikipedia:About

Plus
https://plus.google.com/+google

в знаке, двоеточие, запятая и восклицание mark
https://www.google.com/maps/place/USA/@36.2218457,...

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

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

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

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

Visit http://example.com/foo=bar! !

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

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

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

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

    reserved = gen-delims / sub-delims

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

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

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

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

    unreserved = Альфа / цифра/" -"/"."/ "_" / "~"

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