使用变音符号将任何传入的URL重定向到等效的,没有变音符号

时间:2015-12-11 19:36:57

标签: c# asp.net

如何为带重音的网址实现网址重定向?我希望所有带有重音符号的潜在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中有一种简单的方法吗?

2 个答案:

答案 0 :(得分:3)

我认为您的意思是Redirect而不是Rewrite,因为Rewrite意味着网址保持不变,并且您展示了预期的内容(我认为这就是您所做的事情&# 39; t想要。)

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

使此自定义路由成为路由表中首先要评估的路径,并将此自定义路由映射到" RedirectController" (您将创建)负责从URL中删除特殊字符并将用户重定向到没有特殊字符的URL

答案 1 :(得分:0)

在每个请求开始时,您可以进行此检查以执行重定向。在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));
}