【问题标题】:Url routing to lowercase how to?url路由要小写怎么办?
【发布时间】:2012-01-27 13:26:13
【问题描述】:


我在 asp.net mvc3 上开发了一个 Web 应用程序,现在我需要制作小写的路由
示例:

 that's what i have:
 http://www.example.com/SubFolder/Category/Index => looks ugly :-)

 that's how i would like it:
 http://www.example.com/subfolder/category/index

我找到了这个帖子:
http://goneale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/

其实我需要用到页面底部global.asax里面的代码。

protected void Application_BeginRequest(Object sender, EventArgs e)   
{
    string lowercaseURL = (Request.Url.Scheme + "://" + 
    HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
    if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
    {
      lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query;
      Response.Clear();
      Response.Status = "301 Moved Permanently";
      Response.AddHeader("Location", lowercaseURL);
      Response.End();
    }
}

现在是问题:
什么时候在开发站上使用它是完美的,但是当我将它上传到生产环境时它无法正常工作。

在开发站上它只发布帖子,但在生产上它做了两个:

POST - status: 301 Moved Permanently 
GET  - status: 200 OK

而且我根本没有被重定向到正确的路线。 在开发站上它运行良好。

【问题讨论】:

  • ASP.NET URL 不区分大小写,重定向到小写 URL 的意义何在?您正在创建重定向的开销。 POST 上的重定向也将永远无法正常工作。您需要做的就是更改您的 HTML 以反映小写 URL。并且没有这样的法律,即上投网址不好,没有人看它。唯一重要的地方是 robots.txt,它区分大小写。
  • @PKKG,不,搜索引擎优化不区分大小写,而且如果引用链接有不同的大小写并重定向到不同的大小写,可能会损害搜索引擎优化,将其视为不同的词,如果它完全区分大小写的话。跨度>
  • @IamStalker :您能补充一个答案或建议吗?当您接受答案时。不幸的是,现在已删除已接受的答案
  • 你想要我的问题的答案吗?
  • 非常有趣的问题。您的开发 web.config 和部署 web.config 之间有任何差异吗?

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
    string lowercaseURL = (Request.Url.Scheme + 
    "://" +
    HttpContext.Current.Request.Url.Authority +
    HttpContext.Current.Request.Url.AbsolutePath);
    if (Regex.IsMatch(lowercaseURL, @"[A-Z]"))
    {
        System.Web.HttpContext.Current.Response.RedirectPermanent
        (
             lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query
        );
    }
}

【讨论】:

  • 这不是解决这个问题的最佳方式。既然 IIS 可以为您处理,为什么还要在应用程序中处理它?
  • @Terry :你能添加你的答案吗?我可以再次开始赏金现有答案。相信我 !!!!等待您的答复....
  • 我会很感激另一个答案,但如果你没有访问 iis 服务器?
  • @abcdefhi 当然。 iis.net/downloads/microsoft/search-engine-optimization-toolkit。没有必要回答,因为这正是 bigfllahull 发布的内容。
【解决方案2】:

由于您使用的是 ASP.NET MVC,我不认为Application_BeginRequest 是要走的路。 MVC 提供了更好的选项来处理这些需求。

也可以使用 IIS Url Rewrite 模块(使用 Web.config 配置)来实现,但我假设您更喜欢更编程的方法。

改用ActionFilter

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class EnforceLowercaseUrlAttribute : ActionFilterAttribute
{
    private bool _redirect;

    public EnforceLowercaseUrlAttribute(bool redirect = true)
    {
        this._redirect = redirect;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;
        var path = request.Url.AbsolutePath;
        var containsUpperCase = path.Any(char.IsUpper);

        if (!containsUpperCase || request.HttpMethod.ToUpper() != "GET")
            return;

        if (this._redirect)
            filterContext.Result = new RedirectResult(path.ToLowerInvariant(), true);

        filterContext.Result = new HttpNotFoundResult();
    }
}

然后将其应用于控制器/动作:

[EnforceLowercaseUrl]
public ActionResult Index()
{
     ....
}

或在您的Global.asax 中全局注册:

GlobalFilters.Filters.Add(new EnforceLowercaseUrlAttribute());

【讨论】:

  • 大声笑你为什么使用 true 两次?每个动作或控制器都是合乎逻辑的和个人的。而且代码太多。
  • 误以为我将其默认为 false。固定。
  • 你总是返回 404。
【解决方案3】:

我是这样做的,我创建了一条自定义路线。这也使得 Html.ActionLink 等助手也可以创建可操纵的路由。

首先我用一个自定义对象扩展Route(比如说LowerCaseRoute)并重写GetVirtualPath 方法,如下所示:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
    var path = base.GetVirtualPath(requestContext, values);
    if (path != null)
    {
        // you could do lots more here, like replacing odd characters with - etc.
        path.VirtualPath = path.VirtualPath.ToLower();
    }
    return path;
}

然后我创建一个自定义助手来像这样映射这条路线:

public static LowerCaseRoute MapLowerCaseRoute(this RouteCollection routes, string name, string url, object defaults)
{
    var route = new LowerCaseRoute(url, new MvcRouteHandler());
    route.Defaults = new RouteValueDictionary(defaults);
    route.DataTokens = new RouteValueDictionary();
    route.DataTokens.Add("RouteName", name);
    routes.Add(name, route);
    return route;
}

这样您就可以像这样在global.asax 中创建路由:

RouteTable.Routes.MapLowerCaseRoute("routeName", "baseurl/someother/{param}", { controller = "Controller", param = UrlParameter.Optional });

这可以让项目中的所有内容保持整洁和明显,并为您提供更多选项来操作您的路线。

【讨论】:

    【解决方案4】:

    如果这只是为了 SEO,最简单的解决方案也是我会使用的解决方案是使用 url 重写(假设您在 IIS 上托管)或 mod rewrite(如果您在 Apache 上托管)来强制使用小写 url 并离开照原样发布。

    使用 IIS 就像从 Web 平台安装程序安装 url rewrite 一样简单,点击添加规则并选择“强制小写 URL”。很简单。

    如果你升级到 mvc4 并且真的想要小写的帖子,有一个属性 LowercaseUrls 可以在注册路由时设置为 true。但再说一遍 - 我不会打扰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      相关资源
      最近更新 更多