哪些字符允许在GET参数,无需编码或逃避呢? 我的意思是这样的:
http://www.example.org/page.php?name=XYZ
你能有什么存在的,而不是某某? 我认为只有以下字符:
- 和(Z)
- 0-9
- -
- _
这是完整列表或者允许有其他字符?
我希望你能帮助我。 提前致谢!
哪些字符允许在GET参数,无需编码或逃避呢? 我的意思是这样的:
http://www.example.org/page.php?name=XYZ
你能有什么存在的,而不是某某? 我认为只有以下字符:
这是完整列表或者允许有其他字符?
我希望你能帮助我。 提前致谢!
有保留的字符 ,具有保留含义,这些都是分隔符- :/?#[]@
-和subdelimiters - !$&'()*+,;=
还有一组称为毫无保留的字符的字符-字母数字和-._~
-未进行编码。
这意味着, 不属于无保留地设置字符的东西应该是%编码,当他们没有特殊的含义(例如,当作为一部分通过GET
参数)。
参见RFC3986:统一资源标识符(URI):通用语法
该问题询问哪些字符在GET参数允许不进行编码或逸出它们 。
根据RFC3986 (一般URL语法)和RFC7230,节2.7.1 (HTTP / S的URL语法),你需要百分之编码的字符只有的查询集之外的外面,见下面的定义。
不过,也有更多的规范,比如HTML5, Web表单,和过时的索引搜索 ,W3C建议。 这些文件添加特殊的含义一些字符值得注意的是,像符号= +; 。
这里其他的答案表明,大部分保留的字符应进行编码,其中包括“/”,“?”。 这是不正确的。 事实上, RFC3986,第3.4节建议不要百分号编码“/”,“?” 字符。
有时可用性更好地避免percent-编码的字符。
RFC3986定义查询组件为:
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
A-百分号编码机制被用来表示在组件数据八比特组时该八位组的对应的字符是允许的一组外或正被用作的定界符,或内,该组件。
结论是,XYZ部分应编码:
special: # % = & ;
Space
out of query set: [ ]
non ASCII encodable characters
除非特殊符号 =&; 是关键=值的分隔符。
编码其他字符被允许,但不是必需的。
从RFC 1738在哪些字符被允许的网址:
只有字母数字,特殊字符“$ -_。+!*'()”,和用于各自保留目的的保留字符可以在URL中使用未编码。
保留的字符是“;”,“/”,“:”,“@”,“=”和“&”,这意味着你将需要URL编码他们,如果你想使用这些“?”。
字母数字字符和所有的
~
-
_
.
!
*
'
(
)
,
是一个URL内有效。
所有其它字符都必须进行编码。
我没有使用Chrome的地址栏和测试$QUERY_STRING
在bash,并观察以下几点:
~!@$%^&*()-_=+[{]}\|;:',./?
和grave (backtick)
被通过作为明文传递。
,
"
, <
和>
被转换为%20
, %22
, %3C
和%3E
分别。
#
被忽略,因为它由叶奥尔德锚 。
就个人而言,我会说硬着头皮用Base64编码:)
所有涉及的URI(它包含的URN和URL)在RFC1738和RFC3986中指定的编码规则,这里有一个TL;这些长而枯燥的文件,DR:
%的编码,也被称为URL编码,为在某些情况下在一个URI编码信息的机制。 中允许的URI中的字符被保留或预留状态。 保留的字符是那些有时有特殊含义的字符,但他们并不需要编码的唯一人物。
有66个不需要任何编码保留字元: abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~
有需要被编码的18个保留字符: !*'();:@&=+$,/?#[]
和所有其他的字符必须进行编码。
以百分比编码的字符,简单地拼接“%”和十六进制字符的ASCII值。 PHP函数“用urlencode”和“rawurlencode”为你做这项工作。
"." | "!" | "~" | "*" | "'" | "(" | ")"
"." | "!" | "~" | "*" | "'" | "(" | ")"
也是可接受的[RFC2396] 。 真的,什么都可以在一个GET参数是否正确编码。