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

时间:2015-01-31 11:47:00

标签: javascript url browser unicode

大多数浏览器(例如Firefox和Chrome)在请求之前对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字符,这样当用户点击某个链接时,就会从其中请求其纯(原始)网址服务器

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

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

1 个答案:

答案 0 :(得分:5)

  

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

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

  

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

HttpURLConnection不支持IRI。它试图按原样发送URI,但它确实应该因为无效而拒绝它。

  

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

根据HTTP标准,在请求行(RFC7230绝对路径 - > RFC3986段)中发送原始非ASCII字节无效。当提供此类无效请求时,Web服务器会执行不同的,不可预测的事情。它始终是最好避免的。

无法告知支持IRI的浏览器忽略正确的行为并发送非ASCII请求行,但您为什么要这样做?你想在这做什么?