2011-03-05 39 views
0

我正在IIS 7上運行一個Sitefinity CMS網站。當我試圖返回404狀態時,我看到了一些奇怪的結果。IIS 7錯誤代碼

如果我去像一個網址:

www.mysitefinitywebsite.com/test.co.uk(我意識到這是一個無效的地址,但有人進入它進入CMS)

由於上面沒有一個ASPX頁面,我相信IIS處理錯誤,用下面的代碼:

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

在地址欄中的URL保持不變,顯示我的自定義404頁(/404.aspx)頁面,然而,返回http狀態碼200。

然而,如果下面的網址是鍵入:

www.mysitefinitywebsite.com/test.aspx - 的ASPX錯誤處理程序踢在以下配置:

<customErrors mode="On" > 
    <error redirect="~/Sitefinity/nopermissions.aspx" statusCode="403" /> 
    <error redirect="~/404.aspx" statusCode="404" /> 
</customErrors> 

同樣,我的自定義404顯示頁面,但是URL地址欄更改爲:

www.mysitefinitywebsite.com/404.aspx?aspxerrorpath=/test.aspx

而且奇怪的是,如果我檢查Firebug,則返回302代碼爲text.aspx,然後爲/404.aspx?aspxerrorpath=/test.aspx返回200的狀態。

我不完全理解這裏發生了什麼,它似乎是IIS沒有響應與狀態代碼 - 是由設計?似乎完全瘋了!

如果是通過設計,大概解決它的唯一方法是以編程方式返回正確的響應代碼?

在此先感謝 higgsy

回答

0

當您使用<httpErrors>元素,並使用executeUrl,你是動態內容服務。如果該內容沒有明確返回狀態代碼(asp.net,asp等頁面),則需要將existingResponse屬性設置爲auto/replace/passthrough,只要您認爲合適。

這裏的意圖是網絡服務器可以有一個通用的錯誤,你可能想要返回一個不同的或擴展的錯誤代碼給你的客戶端。這對於那些您可能希望404包含/返回更多關於什麼未找到的信息等的API更有意義。

查看httpdError對於existingResponse標記的IIS.NET文檔

http://www.iis.net/ConfigReference/system.webServer/httpErrors


對於ASP.NET,302重定向錯誤是默認的行爲,這是你所看到的。 B/C頁面返回404,您正在重定向到以編程方式設置響應的狀態代碼。

不同之處僅僅在於處理。首先,您允許IIS在執行ASP.NET管道之前處理錯誤。第二,IIS傳遞給ASP.NET管道。他們是兩種不同的技術,因此是兩種不同的行爲。放心一點研究,你可以讓他們都做同樣的事情。