asp.net-mvc - 如何确保 POST 上的小写 URL?

标签 asp.net-mvc seo url-rewriting url-routing

我试图确保用于访问我的 ASP.NET MVC 站点的所有 URL 都是小写的。如果 URL 中有大写字母,我会将状态代码更改为 301,并将位置更改为使用以下代码的 URL 的小写版本:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var url = Request.Url.ToString();
    if (Regex.IsMatch(url, @"[A-Z]"))
    {
       Response.Clear();
       Response.Status = "301 Moved Permanently";
       Response.StatusCode = (int)HttpStatusCode.MovedPermanently;
       Response.AddHeader("Location", url.ToLower());
       Response.End();
     }
}

然而,最近一位同事试图将一个表单发布到一个带有大写字母的 URL(忘记了重定向),但该操作(标有 HttpPost 属性)没有被命中。查看 Firebug 中的请求显示原始 POST,但随后返回 301 并向小写版本发出 GET。

我猜最好的解决方案是确保所有 POST 都是 URL 的小写版本,但我来这里是为了看看是否有另一种方法来处理这个问题

最佳答案

您可以为路由创建一个扩展方法,它将呈现所有 url 的小写:

代码:

 public class LowercaseRoute : System.Web.Routing.Route
    {
        public LowercaseRoute(string url, IRouteHandler routeHandler) : base(url, routeHandler) { }
        public LowercaseRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) : base(url, defaults, routeHandler) { }
        public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler) : base(url, defaults, constraints, routeHandler) { }
        public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler) : base(url, defaults, constraints, dataTokens, routeHandler) { }

        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            VirtualPathData path = base.GetVirtualPath(requestContext, values);

            if (path != null)
                path.VirtualPath = path.VirtualPath.ToLowerInvariant();

            return path;
        }
    }

    public static class RouteCollectionExtensions
    {
        public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults)
        {
            routes.MapRouteLowercase(name, url, defaults, null);
        }

        public static void MapRouteLowercase(this RouteCollection routes, string name, string url, object defaults, object constraints)
        {
            Check.Argument.IsNotNull(routes, "routs");
            Check.Argument.IsNotNull(url, "url");

            var route = new LowercaseRoute(url, new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary(defaults),
                Constraints = new RouteValueDictionary(constraints)
            };

            if (String.IsNullOrEmpty(name))
                routes.Add(route);
            else
                routes.Add(name, route);
        }
    }

您的路线:

routes.MapRouteLowercase(
                "Default", 
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
            );

现在,当您使用 ...Html.BeginForm()... 时,它将为该操作呈现一个小写的 URL。每当您使用路由来呈现链接时,这也将始终呈现小写 url,即 Url.Action(); <%:Html.RenderAction() %>

关于asp.net-mvc - 如何确保 POST 上的小写 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4349588/

相关文章:

c# - MVC 路由问题 : null entry

c# - 访问服务器的 Windows 身份验证

c# - 为什么尝试在 Windsor .net core 中注册作用域组件时会发生 'Scope was not available' 错误?

url-rewriting - 使用 IIS URL 重写将子文件夹重定向到子域/子文件夹

Apache 重写规则 - 防止重写的 URL 出现在浏览器 URL 栏中

asp.net - 在与 IIS 8.5 (ASP.NET) 兼容的 WEB.CONFIG 中将 HTTP 重定向到 HTTPS

javascript - 如何获取 Kendo 网格中复选框的值

seo - 打开我网站的 www 版本导致我首选的非 www 版本在 drupal 7 中被破坏

php - URL 重写和 robots.txt

html - 如何减小大图像的文件大小以缩短页面加载时间?