HTTP查询和URI编码的疑惑

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

实际上,RFC 3986(统一资源标识符(URI):通用语法)没有提及任何关于查询字符串片段的格式,并且结束于定义允许哪些字符以及如何对其他字符进行编码。 (我稍后会回到这个。)

我发现的唯一的东西是关于如何将表单改为查询字符串的HTML规范(HTML 4.01; 17.13.4表单内容类型,应用程序/ x-www-form-urlencoded)。 HTML 5算法似乎足够接近(4.10.22.5 URL编码的表单数据)。

这可能看起来不错。 毕竟为什么有人想为其他人设置查询字符串格式。 做什么的? 但是,除了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&符号在URI属性值)建议的HTTP服务器接受分号( ; )为参数的分离器(反对AMPERSAND & )。

任何服务器都支持它吗? 有人使用这个吗? 这是值得打扰的(当考虑允许格式的查询字符串的Web服务)?


那么非ASCII字符如何支持?

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

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

是否有任何标准或做法如何处理这种情况?


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

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


你检查过HTTP specyfication(RFC2616)吗?

看看这些部分:

  • http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2
  • http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2

  • 实际的建议是使用Base64编码你期望包含危险字符的字段,然后在你的后端解码它们。

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


    实际上,RFC 3986(统一资源标识符(URI):通用语法)没有提及任何关于查询字符串片段的格式

    是的,它在3.4节中提到:

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

    第3.3节中定义了pchar

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

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

    究竟。 这是定义查询字符串片段的格式。

    但从RFC 3986看来,在查询字符串中都不允许[也]。

    正式,是的。 但并非所有的浏览器都这么做,这是他们的行为。 我见过的所有官方规格(而且3986不是唯一玩家)说这些角色必须是百分比编码的。

    那么非ASCII字符如何支持?

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

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

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

    链接地址: http://www.djcxy.com/p/17587.html

    上一篇: HTTP query and URI encoding doubts

    下一篇: HTTP Test server that accepts GET/Post calls