HTTP查询和URI编码疑惑

标签 http url uri query-string urlencode

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

6年前关闭。




Improve this question




最近我正在研究 HTTP 查询字符串,同时想知道 Web 服务访问接口(interface) 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、图像……)时,“降级”名称会“感觉不对”。特别是如果希望用户将这些文件保存在磁盘上..如何处理这个问题?

最佳答案

你检查过 HTTP 规范(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对您希望包含风险字符的字段进行编码,然后在后端对其进行解码。

    顺便提一句。你的问题真的很长。它减少了有人深入研究它的机会。

    关于HTTP查询和URI编码疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12920242/

    相关文章:

    PHP:更清晰的分页 url(文件夹)

    http - 如何在 anchor 中指定协议(protocol)并仍然使用相对路径?

    javascript - 无法通过 url 访问 Ember 子路由并将我重定向到父路由

    wordpress - wp_remote_post 响应体被保护

    javascript - Angular 2 没有在后续请求中传递 JSESSIONID

    java - 400 - 错误的请求 - 请求在语法上不正确

    PHP - 在字符串中添加指向 URL 的链接

    c# - 尝试使用 WebClient 下载 URL 中包含 ':' 的文件

    jsp - 我应该在 JSP 中引用哪个 JSTL URL?

    node.js - 跨源 HTTP 请求源自服务器端 NodeJS/Axios/JSDOM