大型网站的404错误一般都会自定义,会自己做一个单独的页面,很多少人都会选择在IIS配置,但是这样配置出来的404,会在浏览器先会产生一个302跳转再是404,不相信的同学可以用firebug看一下。这样其实对seo不不好的,因为没有正常的返回404错误。下面我分享一下我在mvc中自定义404代码避免302,让第一次就返回404的方法。
1、首先定义一个错误控制器,定义404的Action为NotFound方法
public class ErrorController : Controller
{
// GET: /Error/
public ActionResult Index()
{
return View();
}
public ActionResult NotFound()
{
Response.Status = "404 Not Found";
Response.StatusCode = 404;
return View();
}
}
2、定义一个404视图
视图即为Action NotFound的视图,里面就可以写一个个性化的东西。
3、捕捉404错误,并手动转到404的action
在Global.asa.cs添加代码
protected void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
var code = (error is HttpException) ? (error as HttpException).GetHttpCode() : 500;
if (code != 404)
{
Response.Clear();
Server.ClearError();
}
else
{
//防止302,对seo友好。
var exception = Server.GetLastError();
var httpException = exception as HttpException;
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Error";
routeData.Values["action"] = "NotFound";
routeData.Values["exception"] = exception;
Response.TrySkipIisCustomErrors = true;
IController errorManager = new Controllers.ErrorController();
HttpContextWrapper wrapper = new HttpContextWrapper(Context);
var rc = new RequestContext(wrapper, routeData);
errorManager.Execute(rc);
}
}