根据https://www.rfc-editor.org/rfc/rfc5987,HTTP 标头字段应使用 ISO-8859-1 字符编码返回。
这也适用于用于重定向的 Location 字段。但是,查看以下示例,尽管 URL 未编码,但我还是无法弄清楚重定向如何工作。
我运行了不同的工具,包括 Google Chrome Developer,位置字段肯定是经过编码的,但使用 CURL 或 Screaming Frog 等软件会返回用西里尔字符书写的位置。理论上,重定向应该解析为 404,但我得到的是 200。
知道这是如何可能的吗?
答案1
是的,事实上重定向包含 7 位以上的八位字节(大于 0x80 十六进制)。各种应用程序会将这些八位字节转换为屏幕上的各种视觉表示;这取决于编码他们决定使用。
如果有人使用 UTF-8,他们可能会得到良好的西里尔文文本,但这是偶然的;与问题无关。
https://www.rfc-editor.org/rfc/rfc7230#section-3.2 非常明确地指出:
从历史上看,HTTP 允许字段内容包含采用
ISO-8859-1 字符集 [ISO-8859-1] 的文本,仅
通过使用 [RFC2047] 编码来支持其他字符集。实际上,大多数 HTTP 标头
字段值仅使用 US-ASCII 字符集 [USASCII] 的子集。
新定义的标头字段应将其字段值限制为
US-ASCII 八位字节。 接受者应该 其他八位字节在字段
内容中(obs-text)作为不透明数据。
和
obs-文本 = %x80-FF
这意味着,实际上可以发送任何八位字节。显示器标头(例如将八位字节转换为屏幕上可见表示的浏览器)应使用 ISO-8859-1对于此转换。
但在 HTTP 会话中接收数据的服务器也可以自由地使用八位字节进行操作,这是不是涉及在任何屏幕上显示任何视觉表示。在这种情况下,HTTP 服务器使用八位字节为您提供页面。由于 HTTP 服务器只获取一些八位字节的输入并产生一些八位字节的输出,因此“编码”实际上并不适用于此处(HTTP 服务器永远不需要将字节转换为在屏幕或打印机上显示的内容)。