【问题标题】:MVC: 404 route not working properly in productionMVC:404 路由在生产中无法正常工作
【发布时间】:2011-12-09 21:46:19
【问题描述】:

我的 global.asax 底部有以下路线:

//404 ERRORS:
routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "Error", action = "PageNotFound" }
);

这在 Visual Studio 中运行良好,但在生产中我得到了 IIS 错误页面。

这个路由不应该捕获 any URL 未被其他人捕获,因此从 IIS 的角度来看没有 404?在 web.config 中我还有什么需要做的吗?

注意:我确实想重定向到特定于 404 的 URL;相反,我在请求的 URL 处提供 404 错误页面(我相信从可用性的角度来看这是正确的方法)。

更新
在我的错误控制器中,我设置了Response.StatusCode = 404;,这似乎是问题所在。当我删除它并再次部署到生产环境时,我又得到了友好的错误页面。但是,我相信我确实需要 HTTP 标头中的 404 状态——出于 SEO 的目的——所以我现在的问题变成了:

修改后的问题
IIS 如何/为什么拦截响应并发送其开箱即用的 404 错误,我该如何防止这种情况发生?

**解决方案**
Dommer 因建议Response.TrySkipIisCustomErrors=true; 而获奖(我认为)这是必要的。但还有另外 2 个关键细节:

  • 自定义错误需要在 web.config 中开启(呵呵!),并且
  • 404 操作必须具有 [HandleErrors] 属性。

让它无处不在
由于某些 URL 可能会映射到“404-PageNotFound”以外的路由但包含无效参数,并且由于我不想 重定向 到 404 页面,因此我在基本控制器中创建了此操作:

[HandleError]
public ActionResult NotFound()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true;     
    return View("PageNotFound", SearchUtilities.GetPageNotFoundModel(HttpContext.Request.RawUrl));          
}

在任何继承基础的控制器动作中,只要我捕获到无效的路由参数,我只需调用它:

return NotFound();

注意:不是 RedirectToAction()

锦上添花:
我生成并传递到视图中的模型是将 URL 的冗长部分输入我们的搜索引擎,并在友好的 404 页面上显示前 3 个结果作为建议。

【问题讨论】:

  • 很高兴你能成功。看起来还不错!

标签: asp.net-mvc iis-7 asp.net-mvc-routing http-status-code-404


【解决方案1】:

问题是您的请求与您之前的路线之一匹配,然后失败了。一种可能的解决方案是尝试像这样限制其他路线:

// This will match too many things, so let's constrain it to those we know are valid
   routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { controller = "Home|OtherController|AnotherController|..." } // regular expression matching all valid controllers
);

//404 ERRORS:
routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "Error", action = "PageNotFound" }
);

如果您想要更全面的答案,请查看:How can I properly handle 404 in ASP.NET MVC?

编辑:

要摆脱自定义 IIS 错误,请尝试将错误控制器更改为如下所示:

Response.StatusCode = 404;
Response.TrySkipIisCustomErrors=true; // add this line

MSDN 文档:http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

【讨论】:

  • 原来这不是路由匹配问题。相反,我怀疑这是一个 IIS7 设置问题。请在问题中查看我的更新。
  • 我添加了一些应该有帮助的内容。
  • 请注意,您拼错了 TrySkipIisCustomErrors,中间多了一个“i”。
【解决方案2】:

请这样尝试

 routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "account", action = "index", id = UrlParameter.Optional } // Parameter defaults
            );


routes.MapRoute(
                        "404-PageNotFound", // Route name
                        "{*url}", 
                        new { controller = "Error", action = "PageNotFound", id = UrlParameter.Optional } // Parameter defaults
                    );

【讨论】:

  • @Prassanth:404 路由的目的是捕获所有意外请求,因此通配符 {*url} 路由模式是非常必要的——{controller}/{action} 不会做。顺便说一句:我发现了有关我的问题的更多信息,并修改了问题。
  • 我认为需要在 IIS 中进行 DNS 设置重定向。尝试设置DNS以根据要求进行重定向
猜你喜欢
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2015-07-26
  • 2011-12-21
  • 2018-02-09
  • 2016-11-26
相关资源
最近更新 更多