【问题标题】:Return 401 HTTP error status code返回 401 HTTP 错误状态码
【发布时间】:2014-11-10 16:20:01
【问题描述】:

最近我已将我的网站从 AJAX 更新为 ASP.MVC5,因此需要删除仍在搜索引擎中的旧网址。

因为我的旧网址是基于 AJAX 的,Google 不会自行删除它们,因为每个旧网址都会重定向到主页,例如:

mysite.com/#!product/phone/samsung/galaxy3
mysite.com/#!product/phone/iphone/ip4s
mysite.com/#!product/phone/nokia/lumia920

现在解决方案是每次服务器收到来自旧 URL 的请求(包含 #!_escaped_fragment_)时向 Google 返回 401 HTTP 错误状态

如何在 MVC5 中主动将此 401 HTTP 错误状态代码返回给 requester ?非常感谢!

【问题讨论】:

    标签: ajax asp.net-mvc url http-headers


    【解决方案1】:

    您需要创建路线。在路由中写入RedirectLocation 并返回Status

    public class NewUrlRoute : RouteBase
          {
            public override RouteData GetRouteData(HttpContextBase httpContext)
            {
              const string status = "401 HTTP error status";
              var request = httpContext.Request;
              var response = httpContext.Response;
              var title = "";
              var legacyUrl = request.Url.ToString();
              var newUrl = "";
              var id = request.QueryString.Count != 0 ? request.QueryString[0] : "";
    
              if (legacyUrl.Contains(" #!"))
              {
                response.Status = status;
                response.RedirectLocation = "newUrl";
                response.End();
              }
                return null;
            }
    
          }
    

    【讨论】:

    【解决方案2】:

    如果你想在控制器中实现这一点,你可以检查之前的 url 并简单地做:

    HttpContext.Response.StatusCode = 401;
    

    无论您的返回类型如何,路由引擎都会自动处理响应头。

    【讨论】:

    • 如何在全局范围内执行检查并返回状态码,而不是将此代码嵌入每个控制器中?
    • @hoangnnm 有几种方法可以实现这一目标。您可以实现基本控制器并覆盖控制器请求管道方法之一。看这里msdn.microsoft.com/en-us/library/system.web.mvc.controller.aspx,特别是 BeginExecute、Ecexute 等,或者您可以查看自定义控制器工厂,您可以在其中访问路由数据并呈现响应。但是,我会实现一个类似于 Dimitry 建议的自定义路由处理程序。你可以在这里看到一个很好的例子codeproject.com/Articles/595520/…
    【解决方案3】:

    解决了,原来有一个非常简单的方法:.NET MVC-4 routing with custom slugs

        protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            var url = requestContext.HttpContext.Request.Path.TrimStart('/');
    
    
            if (!string.IsNullOrEmpty(url))
            {
                if (url.Contains("_escaped_fragment_"))
                    requestContext.HttpContext.Response.StatusCode = 401;
                else
                    requestContext.HttpContext.Response.StatusCode = 404;
    
                FillRequest("Error","Index", requestContext);
            }
    
            return base.GetHttpHandler(requestContext);
        }
    

    通过这种方式,我什至可以实现404 custom error page,这是我之前在没有任何运气的情况下苦苦挣扎的(下面的代码不起作用,上面的代码可以):

            // Add this code to handle non-existing urls
            routes.MapRoute(
                name: "404-PageNotFound",
                // This will handle any non-existing urls
                url: "{*url}",
                // "Shared" is the name of your error controller, and "Error" is the action/page
                // that handles all your custom errors
                defaults: new { controller = "Error", action = "Index" }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2016-04-16
      • 2012-11-14
      • 2018-12-13
      相关资源
      最近更新 更多