HTTP查询和URI编码疑惑

时间:2012-10-16 17:27:29

标签: http url uri query-string urlencode

最近,我在研究HTTP查询字符串,同时想知道Web服务访问接口 API 的可能性。它似乎非常不明确。

实际上RFC 3986 (Uniform Resource Identifier (URI): Generic Syntax)没有说明查询字符串片段的格式,最后是定义允许哪些字符以及如何编码其他字符。 (我稍后会回到这里。)

我发现的唯一一件事是关于表单如何被破坏成查询字符串(HTML 4.01; 17.13.4 Form content types, application/x-www-form-urlencoded)的HTML规范。 HTML 5算法似乎足够接近(4.10.22.5 URL-encoded form data)。

这似乎没问题。毕竟为什么有人想为其他人设置查询字符串格式。做什么的?但是还有其他(不是HTML)完善的标准吗?还有其他人使用不同的格式吗?


这里的一个问题是在表单字段名称中处理[]。 PHP使用它来确保$_GET超全局变量中出现多次出现的字段。 (否则只出现最后一次。)

但是从RFC 3986开始,查询字符串中似乎不允许[]。然而,我对各种浏览器的实验表明,没有浏览器对这些字符进行编码,它们就像URI那样......

这是现实生活吗?或者我测试不正确?我在IIS 7上使用PHP 5.3.17进行了测试。使用Internet Explorer,Firefox和Chrome。然后我比较了$_SERVER['QUERY_STRING']$_GET中的内容。


另一个问题是对分号分离的现实支持。

HTML 4.01规范(B.2.2 Ampersands in URI attribute values)建议HTTP服务器接受分号(;)作为参数分隔符(与&符号&相对)。

是否有任何服务器支持它?有人用这个吗?是否值得为此烦恼(在考虑Web服务的允许格式的查询字符串时)?


那么非ASCII字符怎么支持?

HTML 4.01规范(B.2.1 Non-ASCII characters in URI attribute values)清楚地重述了首先描述RFC的URI:URI中不允许使用非ASCII字符。然而,规范考虑了现有的做法(使用非法URI)和将这些字符更改为UTF-8编码的建议,然后用URI标准的十六进制编码处理每个字节。

从我的测试看来,例如Chrome和Firefox就是这样做的。但Internet Explorer没有,只是发送了这些字符。 PHP部分应对了这一点。 $_SERVER['QUERY_STRING']$_GET包含这些字符。但$_SERVER['REQUEST_URI']代替了?

是否有任何标准或做法如何处理此类案件?


另一个相关的问题是,作者应该如何发布(通过URI)包含非ASCII(例如国家)字符的名称的资源?考虑到所有各方(HTML代码,浏览器发送请求,浏览器保存文件执行磁盘,服务器接收和处理请求以及存储文件的服务器),似乎几乎不可能让它始终如一地工作。或者至少我从未管理过。

说到网页,我已经习惯了,并且总是用相应的拉丁字母替换国家字符。但是当涉及到外部文件(PDF,图像,......)时,“降级”这些名称在某种程度上“感觉不对”。特别是如果有人希望用户将这些文件保存在磁盘上。如何处理这个问题?

2 个答案:

答案 0 :(得分:1)

你检查过HTTP specyfication(RFC2616)吗?

看看这些部分:


实用的建议是使用Base64对您希望包含危险字符的字段进行编码,然后在后端对其进行解码。

顺便说一下。你的问题很长。它减少了有人挖掘它的机会。

答案 1 :(得分:1)

  

实际上RFC 3986(统一资源标识符(URI):通用语法)没有说明查询字符串片段的格式

是的,确实如第3.4节所述:

query       = *( pchar / "/" / "?" )

pchar在第3.3节中定义:

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
  

结束于定义允许哪些字符以及如何编码其他字符。

完全。这是定义查询字符串片段的格式。

  

但是从RFC 3986看来,查询字符串中似乎都不允许[nor]。

正式,是的。但并非所有浏览器都这样做,而这就是他们自己的行为。我见过的所有官方规格(以及3986不是唯一正在播放的规格)都说这些字符必须是百分比编码。

  

那么非ASCII字符怎么支持?

URI中不允许使用非ASCII字符。它们必须是字符集编码和百分比编码。使用的实际字符集是特定于服务器的,没有规范允许URI指定使用的字符集。各种规格推荐使用UTF-8,但不需要UTF-8,而且一些外国服务器确实不使用UTF-8。

替换URL / URI规范的IRI规范(RFC 3987)支持完整的Unicode字符集,但IRI仍然相对较新,许多服务器尚不支持它们。但是,RFC确实定义了将IRI转换为URI的算法,反之亦然。

如果有疑问,百分比编码您不确定的所有内容。服务器在存在时需要支持解码,然后根据需要处理解码数据。