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

301使用unicode字符重定向-C#,c#,.net,http-status-code-301,C#,.net,Http Status Code 301,我需要对可能包含Unicode字符的URL执行301重定向 HttpUtility.UrlEncode没有做我需要的事情,因为如果我对整个URL进行编码,它会对任何“:”或“/”进行编码 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 (另外:在firefox或IE中似乎不起作用,但在Chrom

我需要对可能包含Unicode字符的URL执行301重定向

HttpUtility.UrlEncode没有做我需要的事情,因为如果我对整个URL进行编码,它会对任何“:”或“/”进行编码

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
(另外:在firefox或IE中似乎不起作用,但在Chrome中起作用)


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

你需要看看如何正确编码国际域名的哪些细节——这也是为什么当你只对域名部分进行编码时,它只在Chrome中工作的原因)

所以我算出了几乎100%这个问题的解决办法。感谢Rowland Shaw和Rup为我指明了IDNs的方向

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

这使我想到:

它告诉我们如何使Uri类接受unicode并进行IDN和IRI转换。它说您必须向.NET 2.0 machine.config文件中添加一些内容,但您可以将这一行放在web.config中,这样就可以了

在使用unicode获得Uri后,我拼凑url并进行重定向:

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中失败。我仍在尝试解决该问题,如果找到解决方案,将在此处更新。

我认为在将域传递到重定向之前,您需要将域编码为/punycode(恶心的名称),而不仅仅是对您所拥有的进行URL编码。IE8错误仅在我的重定向URL的域是本地域时才会出现。因此,哪个重定向到IRI将失败,但哪个重定向到相同的IRI将工作。古怪的