2011-02-25 122 views
3

我有一個在IIS 7中運行的ASP.NET 3.5站點
我試圖讓404第一次拋出404狀態碼。IIS7 404錯誤

目前,如果您在

http://www.madeupsiteforexample.com/somethingmadeup

鍵入您通過200
我試圖讓這個圍繞拋出一個404碼第一次顯示404頁,我有收到302後續安裝(/FileNotFound.aspx)

我遇到的問題是要麼404頁面顯示200代碼,要麼當IIS看到404狀態代碼並顯示它自己的可怕的404頁面,而不是我的自定義創建一個。

我已經嘗試使用模塊,global.asax和設置我的404頁面後面的代碼狀態碼。所有的結果在IIS接管。

這裏是我的Global.asax實現

protected void Application_Error(object sender, EventArgs e) 
{ 
    Response.TrySkipIisCustomErrors = true; 
    Response.StatusCode = 404; 
} 

現在我做的Server.Transferring我的要求解決這個問題。
但是,這會導致所有會話都爲空,並且引用Session的任何代碼都會導致異常。此外,代碼嘗試從資源文件中檢索項目會導致異常。

關於在IIS7中執行404的「正確方法」的任何建議或文章?

回答

0

看看這個tutorial,通過配置而不是代碼設置自定義錯誤頁面是正常的。

+1

這些似乎是IIS6的指令? – WebDude 2011-03-01 11:16:58

0

您可以更改頁面,在404顯示通過修改「默認Web站點」下的「錯誤頁面」設置(或特定於應用程序)

+1

你能舉個例子嗎?這似乎仍然讓我的頁面返回一個200狀態碼,並不滿足所有404請求。即www.site.com/idontexist; www.site.com/idontexist/; www.site.com/idontexist.aspx – WebDude 2011-03-01 11:20:03

0

使用Server.TransferRequest的贖罪(IIS6中不支持),而不是Server.Transfer的,如果你想會話仍然可用。

但我的首選方法是調用Response.StatusCode = 404;FileNotFound.aspx並設置web.config中:

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
    <remove statusCode="404" subStatusCode="-1"/> 
    <error statusCode="404" prefixLanguageFilePath="" path="/FileNotFound.aspx" responseMode="ExecuteURL"/> 
    </httpErrors> 
</system.webServer> 

對於其他人,如果你和我一樣,只是與消息顯示主頁404錯誤的頂部,您可以測試它是否是一個404的請求,因爲內部的新請求的狀態代碼被添加到URL即對於

if (Request.Url.ToString().Contains("?404;")) 
{ 
    Response.StatusCode = 404; 
    Util.DisplayMessage("The page you are looking for no longer exists. If you navigated to this page by clicking a link within this site please <a href='" + ResolveUrl("~/contact.aspx") + "'>contact us</a> to let us know."); 
} 

而且路徑圖像,腳本等可能是錯誤的,如果它們相對於FileNotFound.aspx(即,而不是站點根目錄'/ path'或在服務器'〜/ path'解析)並且缺少的頁面(即當前url)位於不同的文件夾中。要解決我告訴瀏覽器基地,其中FileNotFound.aspx位於與基本標記相對路徑,告訴服務器,以配合Context.RewritePath即

Page.Header.Controls.AddAt(0, new LiteralControl("<base href='" + Request.Url.Scheme + "://" + Request.Url.Authority + VirtualPathUtility.ToAbsolute("~/") + "'/>")); 
Context.RewritePath("~/");