如何强制浏览器不规范化 unicode URL

How to force browsers not to normalize a unicode URL?

本文关键字:unicode URL 规范化 何强制 浏览器      更新时间:2023-09-26

大多数浏览器,如Firefox和Chrome,在请求URL之前都会对URL进行Unicode规范化。例如,当 chrome 或 Firefox 想要打开此链接时:

http://fa.wikipedia.org/wiki/سید_محمد_خاتمی

包含波斯语 Unicode 字符,它们会自动将此字符串转换为:

http://fa.wikipedia.org/wiki/%D8%B3%DB%8C%D8%AF_%D9%85%D8%AD%D9%85%D8%AF_%D8%AE%D8%A7%D8%AA%D9%85%DB%8C

我想修改我网站中的超链接,以防止浏览器规范化 unicode 字符,这样当用户单击链接时,会从服务器请求其纯(原始)URL。

有什么技巧吗? 例如,源页面中的一个小 JavaScript 代码链接到此类 URL。

更新:当我通过编程语言请求 url 时,例如 Java 的 HttpURLConnection ,它请求原始 URL 并且不使用任何规范化(除了我显式调用 UrlNormalizer.normalize(url))。但是,大多数浏览器和Linux的GET命令都会进行规范化。

例如,当chrome或Firefox想要打开此链接时:http://fa.wikipedia.org/wiki/سید_محمد_خاتمی

这不是有效的 URI。这是一个IRI。支持 IRI 的 Web 浏览器和其他客户端工具会在后台将其转换为仅 ASCII 的 URI 形式(百分比 UTF-8 编码路径和 Punycode 编码的主机名)。

当我通过编程语言请求网址时,例如Java的HttpURLConnection,它会请求原始URL

HttpURLConnection不支持IRI。无论如何,它都会尝试按原样发送 URI,但它确实应该因为无效而拒绝它。

我想修改我网站中的超链接,以防止浏览器规范化 unicode 字符,这样当用户单击链接时,会从服务器请求其纯(原始)URL。

根据 HTTP 标准,在请求行(RFC7230绝对路径 -> RFC3986 段)中发送原始非 ASCII 字节是无效的。Web 服务器在收到此类无效请求时会执行不同的、不可预测的操作。在任何时候最好避免这种情况。

没有办法告诉 IRI 感知浏览器忽略正确的行为并发送非 ASCII 请求行,但你为什么要这样做呢?你想在这里做什么?