URL中允许的字符


189

是否有人知道可以在GET中使用而无需编码的完整字符列表?目前,我正在使用AZ az和0-9 ...,但我想查找完整列表。

我也很想知道是否有针对即将发布的中文,阿拉伯网址的规范发布(显然这将对我的问题产生重大影响)


5
URI中允许的字符是保留的!*'();:@&=+$,/?#[]还是不保留的A-Za-z0-9_.~-(或%作为百分比编码一部分的百分比字符)
Mikl,2016年

1
在MySQL中,我使用它REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'来查找带有错误字符的URL字符串。也许对其他人也有用。
米克

@Mikl:那东西几乎不像正则表达式。
詹斯·曼德

Answers:


179

根据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

5
@Tim斜杠是保留字符,因此,如果将其用于保留目的(描述路径,协议描述...),则不需要转义。否则,它会。
迈尔斯(Myles)2012年

4
RFC 1738的通用语法规则在1998
。– Jukka K. Korpela 2013年

3
其他答案中提到了@ Myles,STD 66(= RFC 3986)。答案的内容是否正确是另一个问题。我认为任何答案都不能正确描述完整列表。
Jukka K. Korpela 2013年

4
您可以A-Za-z0-9_.-~在此答案的开头添加未保留和保留字符的列表。!*'();:@&=+$,/?#[]它可以为人们节省时间
Mikl

2
@basZero对不起,您发现它令人困惑,但是完整的答案并不简单。您的问题的答案是否定的,因为这是一个保留字,具体说明如下:reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
Myles

42

URI中允许的字符是保留的还是不保留的(或作为百分号编码的一部分的百分号)

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

表示这些是RFC 3986非 保留字符(第2.3节)以及保留字符(第2.2节)(如果它们需要保留其特殊含义)。以及百分比字符作为百分比编码的一部分。


7
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。
2014年

链接文档中的@jaestevan Citation:The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
Mikl

26

66个未保留字符的完整列表在RFC3986中,在这里:http ://tools.ietf.org/html/rfc3986#section-2.3

这是以下正则表达式集中的任何字符:

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

2
您也可以使用那些保留的内容。
2013年

过时的RFC1738上市{}^\~backtick不安全。由于文件系统,RFC3986列出\为不安全。这{}^也可以使用。
mgutt

因此,如果您尝试在字符串中找到URL的结尾(即我),则最好按照已接受的答案中的过时标准进行操作...如果要验证URL,则应在答案上使用字符集。
ashleedawg '18年

小心,您已将其编写为正则表达式字符类。确保转义-或将其放在字符类的开头或结尾,因为[.-~]实际上它包含从46到126的所有ASCII字符
。– kwl

19

我通过请求我的网站(apache)并使用德语键盘上所有可用字符作为URL参数进行了测试:

http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~

这些未编码:

^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~

之后未编码urlencode()

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_

之后未编码rawurlencode()

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~

注意:由于RFC 1738而在PHP 5.3.0之前rawurlencode()编码。但这已被RFC 3986取代,因此现在可以安全使用。但是我不明白为什么要对它们进行编码,因为RFC 3986中没有提到它们。~{}rawurlencode()

我进行的另一项测试是关于邮件文本中的自动链接。我测试了Mozilla Thunderbird,aol.com,outlook.com,gmail.com,gmx.de和yahoo.de,它们完全链接了包含以下字符的URL:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@

当然,它们?也是链接的,但前提是仅使用一次。

现在有人建议只使用rawurlencode()字符,但是您是否听说有人在打开这些网站时遇到问题?

星号
http://wayback.archive.org/web/*/http://google.com

冒号
https://en.wikipedia.org/wiki/Wikipedia:关于

加号
https://plus.google.com/+google

标有冒号,逗号和感叹号的符号为
https://www.google.com/maps/place/USA/@36.2218457,...

因此,这些字符应该可以未经编码地使用而不会出现问题。当然,&;由于编码序列如,您不应该使用&amp;。相同的原因同样适用,%因为它通常用于编码char。并=为参数名称分配一个值。

最后,我想说可以使用这些未编码的代码:

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

但是,如果您希望使用随机生成的URL,则不应使用.!,因为这些URL 标记了句子的结尾,并且某些邮件应用程序不会自动链接该URL的最后一个字符。例:

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

实用的方法-做得好。正在寻找您的最后一个名单- +特别是这个标志:-D
Oliver

12

这里

因此,仅字母数字,特殊字符$-_.+!*'(), 和用于保留目的的保留字符可以在URL中未经编码地使用。



5

RFC3986定义了可以在URI中使用的两组字符:

  • 保留字符:/?#[]@!$&'()*+,;=

    保留= gen-delims / sub-delims

    gen-delims =“:” /“ /” /“?” /“#” /“ [” /“]” /“ @”

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

    保留字符的目的是提供一组与URI中的其他数据区分开的定界字符。在保留字符替换为其相应的百分比编码八位字节方面有所不同的URI不等效。

  • 未保留的字符A-Za-z0-9-_.~

    未保留= ALPHA / DIGIT /“-” /“。/“ _” /“〜”

    URI中允许但没有保留用途的字符称为未保留字符。


3

即将发生的变化是针对中文,阿拉伯域名而不是URI。国际化的URI称为IRI,并在RFC 3987中定义。但是,尽管如此,我还是建议您不要自己做,而要依赖现有的经过测试的库,因为URI编码/解码有很多选择,根据规范认为哪些是安全的,而对于实际使用而言是安全的(浏览器) 。


0

如果您想给用户一种特殊的体验,您可以使用pushState它来为浏览器的网址添加各种字符:

在此处输入图片说明

var u="";var tt=168;
for(var i=0; i< 250;i++){
 var x = i+250*tt;
console.log(x);
 var c = String.fromCharCode(x);
 u+=c; 
}
history.pushState({},"",250*tt+u);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.