301使用unicode字符重定向 - C#

时间:2011-02-16 11:10:55

标签: c# .net http-status-code-301

我需要在URL上进行301重定向,其中可能包含Unicode字符。

HttpUtility.UrlEncode没有做我需要的东西,因为如果我对整个网址进行编码,它会编码任何':'或'/'

HttpUtility.UrlEncode("http://www.हिन्दी.com") = http%3a%2f%2fwww.%e0%a4%b9%e0%a4%bf%e0%a4%a8%e0%a5%8d%e0%a4%a6%e0%a5%80.com

(另外:http://www.%e0%a4%b9%e0%a4%bf%e0%a4%a8%e0%a5%8d%e0%a4%a6%e0%a5%80.com似乎不适用于Firefox或IE,但它确实在Chrome中运行)

我能想到的另一件事就是对URL的不同部分进行编码,以便协议不会被编码。

2 个答案:

答案 0 :(得分:3)

您需要查看RFC 3490,其中详细说明了如何正确编码国际域名 - 这也是为什么当您只对域部分进行编码时,它只适用于Chrome)

答案 1 :(得分:1)

所以我想出了几乎100%的解决方案。感谢Rowland Shaw和Rup将我指向IDN的方向。

我尝试使用IdnMapper,其函数GetAscii将unicode域名转换为punycode,但我没有将域与URL的其余部分分开。我尝试将url放入Uri对象,但如果url有unicode字符,我会得到一个UriFormatException。

这导致我:http://msdn.microsoft.com/en-us/library/system.uri(v=VS.90).aspx

说明如何启用Uri类接受unicode并执行IDN和IRI转换。它说你必须在.NET 2.0 machine.config文件中添加一些东西,但是你可以将这行放在web.config中,它会起作用。

在我使用unicode工作后,我拼凑了网址并进行了重定向:

Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", uri.Scheme + "://" + uri.DnsSafeHost + uri.PathAndQuery + uri.Fragment);
Response.End();

这适用于Chrome和Firefox 3.6,但在IE8中失败。我仍在努力解决这个问题,如果找到解决方案,我会在这里更新。