0

我剛剛發佈了一個ASP.NET MVC網站,我在其中構建了自定義錯誤頁面。下面是我如何實現它們:覆蓋虛擬主機的默認錯誤頁面

在ErrorController

​​ 在web.config中

<customErrors mode="On" defaultRedirect="~/500"> 
<error statusCode="403" redirect="~/403"/> 
<error statusCode="401" redirect="~/401"/> 
<error statusCode="404" redirect="~/404"/> 
<error statusCode="409" redirect="~/409"/> 
<error statusCode="500" redirect="~/500"/></customErrors> 

當然,錯誤的請求路由到NOTFOUND方法,等等。理論上,它應該起作用。

但是,我面臨一個問題:現在,我已將我的網站發佈給我的主機(GoDaddy),我注意到返回HTTP狀態的錯誤代碼會導致我的自定義錯誤頁面被默認GoDaddy的

我該如何解決這個問題?當然,最簡單的解決方案是返回200狀態碼,但我更願意返回真正的錯誤代碼(對於SEO等)。

回答

1

你應該問GoDaddy這件事。這不是一個ASP.NET MVC問題。如果他們劫持所有不同於200的狀態碼來顯示他們自己的錯誤頁面,那麼你不能做太多事情。

1

你應該爲每一個狀態代碼創建自定義的ViewResult並重寫這樣

public class NotFoundViewResult : ViewResult 
{ 
    public NotFoundViewResult() 
    { 
     ViewName = "404"; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 

     response.StatusCode = 404; 
     // This will prevent IIS7 (GoDaddy) from overwriting your error page! 
     response.TrySkipIisCustomErrors = true; 

     base.ExecuteResult(context); 
    } 
} 

它的ExecuteReuslt方法你的404視圖應該被共享的文件夾中,以便每個人都可以訪問它,你的ErrorController現在看起來應該是這樣

public ActionResult NotFound() 
{ 
    return new NotFoundViewResult(); 
} 
+0

+1提醒response.TrySkipIisCustomErrors - http://stackoverflow.com/questions/1706934/asp-net-mvc-app-custom-error-pages-not-displaying-in-shared-hosting-environment has一個更詳細的答案和鏈接到Rick Strahl博客上的有用條目 - http://www.west-wind.com/weblog/posts/745738.aspx – KevD 2012-11-06 11:02:29