GET参数中允许哪些字符而不进行编码或转义?我的意思是这样的:
http://www.example.org/page.php?name=XYZ
除了XYZ之外,您还有什么?我认为只有以下几个字符:
- AZ(AZ)
- 0-9
- --
- _
这是完整列表还是允许其他字符?
我希望你能帮助我。提前致谢!
GET参数中允许哪些字符而不进行编码或转义?我的意思是这样的:
http://www.example.org/page.php?name=XYZ
除了XYZ之外,您还有什么?我认为只有以下几个字符:
这是完整列表还是允许其他字符?
我希望你能帮助我。提前致谢!
Answers:
有保留的字符,它们具有保留的含义,它们是定界符— :/?#[]@
—和子定界符—!$&'()*+,;=
还有一组称为非保留字符的字符-字母数字和-._~
-不会被编码。
这意味着,不属于未保留字符集的任何内容在没有特殊含义时(例如,作为GET
参数的一部分传递时)都应进行%编码。
urlencode()
我不知道它是否可以正常工作-PHP函数并不总是这样-但如果可以,则可以使用它进行测试;-)就像我说的那样-保留所有内容,但保留所有内容。
/
和?
。我一直在寻找它,因为Swift不会在他们的stringByAddingPercentEncodingForURLQueryParameter
方法中逃脱这些!(正确地,显然)
该问题询问GET参数中允许哪些字符,而不对它们进行编码或转义。
根据RFC3986(通用URL语法)和RFC7230,第2.7.1节(HTTP / S URL语法),唯一需要百分比编码的字符是查询集之外的字符,请参见下面的定义。
但是,还有其他规范,例如HTML5,Web表单和过时的索引搜索(W3C建议)。这些文档尤其是对某些字符(例如=&+;等)添加了特殊含义。。
此处的其他答案建议应对大多数保留字符进行编码,包括“ /”“?”。那是不对的。实际上,RFC3986第3.4节建议不要对百分比编码“ /”“?” 字符。
对于可用性而言,有时最好避免对这些字符进行百分比编码。
RFC3986将查询组件定义为:
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
当八位字节的相应字符在允许的集合之外或用作组件的定界符或在组件内部时,百分比编码机制用于表示该组件中的数据八位字节。
结论是XYZ部分应编码:
special: # % = & ;
Space
sub-delims
out of query set: [ ]
non ASCII encodable characters
除非特殊符号=&; 是 键=值分隔符。
允许编码其他字符,但不是必需的。
"!" / "$" / "&" ...
“被用作组件的定界符或内部组件”。因此应该进行百分比编码?
我使用Chrome地址栏和一个$QUERY_STRING
bash进行了测试,并观察到以下内容:
~!@$%^&*()-_=+[{]}\|;:',./?
并grave (backtick)
以纯文本格式传递。
,
"
,<
并>
转换为%20
,%22
,%3C
和%3E
分别。
#
被忽略,因为它由ye olde anchor使用。
就个人而言,我想说一下,并使用base64进行编码:)
ALPHA / DIGIT / “-” / “.” / “_” / “~”
有关URI编码(包含URN和URL)的所有规则在RFC1738和RFC3986中指定,这是这些冗长而乏味的文档的TL; DR:
百分比编码(也称为URL编码)是一种在某些情况下对URI中的信息进行编码的机制。URI中允许的字符是保留的还是不保留的。保留字符是有时具有特殊含义的那些字符,但它们并不是唯一需要编码的字符。
有66个不需要任何编码的未保留字符:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~
有18个保留字符需要编码:!*'();:@&=+$,/?#[]
,所有其他字符都必须编码。
要对字符进行百分比编码,只需将“%”及其ASCII值连接为十六进制。php函数“ urlencode”和“ rawurlencode”可以为您完成这项工作。