【发布时间】: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