【问题标题】:301 Redirect with unicode characters - C#使用 unicode 字符进行 301 重定向 - C#
【发布时间】:2011-06-28 06:59:26
【问题描述】:

我需要对可能包含 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

(也: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 的不同部分进行编码,这样协议就不会被编码。

【问题讨论】:

  • 我认为您需要将域编码为 IRI / punycode(糟糕的名称),然后再将其传递给重定向,而不仅仅是对您所拥有的内容进行 URL 编码。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    所以我想出了一个几乎 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 中,它会起作用。

    在 Uri 使用 unicode 后,我拼凑了 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 中失败。我仍在努力解决这个问题,如果找到解决方案,我会在这里更新。

    【讨论】:

    猜你喜欢
    • 2013-04-27
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2017-04-15
    • 2018-03-09
    • 2015-08-15
    • 2014-02-03
    相关资源
    最近更新 更多