【问题标题】:Redirect any incoming URLs with diacritics to equivalent with no diacritics将任何带有变音符号的传入 URL 重定向到没有变音符号的等效 URL
【发布时间】:2016-03-17 19:41:51
【问题描述】:

如何为带有重音符号的 URL 实现 URL 重定向?我希望在没有重音的情况下重写所有带有重音的潜在 URL 请求。这是针对法语网站上的客户名称的。用户应该输入不带重音的名称,但如果他们不这样做,那么我希望他们以任何方式登陆正确的页面。

示例

用户输入:www.mysite.fr/client/andré ==> 用户被重定向到www.mysite.fr/client/andre

数据库中的资源标识符 (clientName) 存储时不带重音符号。这是我的 RouteConfig.cs :

        routes.MapRoute(
            name: "ClientDetails",
            url: "client/{clientName}",
            defaults: new { controller = "Client", action = "ClientDetails" }

我了解removing accents on a string 有多种方法。是的,这将允许我从 Controller 方法中收到的 URL 参数中删除重音符号。但是,我希望保持一致,以便用户始终看到不带重音符号的 URL。因此,如何在整个 Web 应用程序中实现重定向 URL?在 RouteConfig.cs 或 Web.config 中是否有一种简单的方法可以做到这一点?

【问题讨论】:

  • 也许您应该首先阻止此类网址? (也不清楚为什么您当前的路由存在重音字符问题)。
  • @MethodMan 不完全是,因为该问题没有解释如何实现重音的 URL 重写。它仅显示如何更改字符串。我错过了最后一步。谢谢
  • @AlexeiLevenkov 如上所述,资源标识符(在数据库中)不允许重音符号。我同意防止带有重音的 URL 是最佳做法。这就是为什么我想将任何带有重音符号的 URL 重写为非重音符号

标签: c# asp.net


【解决方案1】:

我认为您的意思是 Redirect 而不是 Rewrite,因为 Rewrite 意味着 URL 保持不变,并且您显示预期的内容(我认为这是您不想要的)。

我认为您想要的策略可以通过创建一个 custom route constraint 来实现,该custom route constraint 匹配具有任何特殊字符的所有内容。

将此自定义路由设为在您的路由表中首先要评估的内容,并将此自定义路由映射到“RedirectController”(您将创建该控制器),该控制器负责从 URL 中删除特殊字符并重定向用户访问没有特殊字符的 URL

【讨论】:

  • 正确,将我的问题从Rewrite 更新为Redirect。有没有人有带有重音的 URL 的实现示例?
  • Google 搜索“RegEx 变音符号”,例如stackoverflow.com/questions/30247777/…
  • 这不需要制作 2 条自定义路由,一条包含任何重音符号,一条不包含重音符号吗?
【解决方案2】:

在每个请求开始时,您可以进行此检查以执行重定向。在您的 Global.asax.cs 文件中,包含以下内容...

protected void Application_BeginRequest()
{
    var originalUri = HttpContext.Current.Request.Url;
    var finalUri = new UriBuilder(originalUri);

    finalUri.Path = RemoveAccents(
        originalUri.GetComponents(UriComponents.Path, UriFormat.SafeUnescaped)
    );

    // Check if the URL has changed
    if (!originalUri.Equals(finalUri.Uri))
    {
        HttpContext.Current.Response.Redirect(finalUri.Uri.ToString(), true);
        HttpContext.Current.Response.End();
    }
}

您可能还想为finalUri.QueryUriComponents.Query 添加另一行。对于 RemoveAccents,我尝试了以下代码,但您可以使用您喜欢的代码:

public string RemoveAccents(string input)
{
    return Encoding.UTF8.GetString(Encoding.GetEncoding(1251).GetBytes(input));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2010-11-28
    • 2017-02-10
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多