Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html HTTP查询字符串中必须转义哪些字符?_Html_Http_Url_Query String - Fatal编程技术网

Html HTTP查询字符串中必须转义哪些字符?

Html HTTP查询字符串中必须转义哪些字符?,html,http,url,query-string,Html,Http,Url,Query String,此问题涉及URL的查询字符串部分中的字符,这些字符出现在?标记字符之后 根据,某些字符按原样保留,其他字符按原样编码(通常使用%转义序列) 我一直在努力追踪到实际的规范,以便我理解维基百科页面中每个要点背后的理由 矛盾示例1: 表示将空间编码为+,并将其余部分延迟到。但是,该RFC指出~是不安全的,而且“[a]所有不安全字符必须始终在URL中编码”。这似乎与维基百科相矛盾 实际上,IE8在它生成的查询字符串中编码~,而FF3保持原样 矛盾示例2: 维基百科声明所有未提及的字符都必须进行编码。但是

此问题涉及URL的查询字符串部分中的字符,这些字符出现在
标记字符之后

根据,某些字符按原样保留,其他字符按原样编码(通常使用
%
转义序列)

我一直在努力追踪到实际的规范,以便我理解维基百科页面中每个要点背后的理由

矛盾示例1:

表示将空间编码为
+
,并将其余部分延迟到。但是,该RFC指出
~
是不安全的,而且“[a]所有不安全字符必须始终在URL中编码”。这似乎与维基百科相矛盾

实际上,IE8在它生成的查询字符串中编码
~
,而FF3保持原样

矛盾示例2:

维基百科声明所有未提及的字符都必须进行编码<代码>。但是声明
是一个“特殊”字符,“可以在未编码的情况下使用”。这似乎与维基百科所说的必须进行编码相矛盾

实际上,IE8编码
在它生成的查询字符串中,而FF3保持原样

我知道这可能是为了给维基百科和规范之间存在疑问的字符编码。甚至可能对所有不是[A-Za-z0-9]的东西进行编码。我只想知道这方面的实际标准

结论

维基百科上描述的算法精确地编码了那些不需要的字符。也就是说,它对除字母数字和
-.\uuz~
以外的所有字符进行编码。作为一种特殊情况,根据RFC3986,空格编码为
+
,而不是
%20

某些应用程序使用较旧的RFC。比较而言,它们是字母数字和
!'()*-。


为便于比较,对除字母数字和
*-.\uu
以外的所有字符进行编码。空格的特殊情况编码仍然是
+
。显著的区别是,
*
未编码,
~
已编码。(从技术上讲,
*
的这种处理方式与RFC3986兼容,即使
*
保留的
中,因为它在
子文件中,这在
查询
生产中是允许的。)

具体来说,答案在RFC 3986文档中

查询组件由第一个问题指示 标记(“?”)字符并以数字符号(“#”)字符结尾 或者在URI的末尾

字符斜杠(“/”)和问号(“?”)可以表示数据 在查询组件中

技术上,将查询组件定义为:

query       = *( pchar / "/" / "?" )
此语法意味着查询可以包括来自
pchar
以及
/
的所有字符
pchar
引用另一种路径字符规范。RFC 3986中列出了相关的ABNF定义,最值得注意的是:

query         = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
因此,除了所有字母数字和百分比编码字符外,查询还可以合法地包括以下未编码字符:

/ ? : @ - . _ ~ ! $ & ' ( ) * + , ; =

当然,您可能需要记住,“=”和“&”在查询中通常具有特殊意义。

维基百科不是一个标准机构。如果有疑问,请使用标准。@John-尽管使用正确的标准很重要。在本例中是3986,而不是旧的1738。(在这种情况下,“每个部分的保留字符不同”一节非常重要)。注意:除了
=
&
,服务器端可能会限制其他法律上未编码的查询字符串,例如PHP中的
(点),在这里它将被
(下划线)替换在
$\u GET
$\u POST
中。请参阅:(还有一个解决方法)。那么,PHP用户需要在
$\u服务器['QUERY\u STRING']
上使用符合规范的解析器,而不是依赖像
$\u GET
这样的坏特性。