2011-02-11 108 views
8

爲了允許ColdFusion顯示其錯誤而不僅僅是服務器錯誤(代碼500),我已根據本網站中的一些發現添加到web.config中。Coldfusion錯誤和IIS7.5錯誤頁面

問題看起來解決,但......

當我訪問在IIS中不存在的目錄,它返回一個「空白」頁面沒有任何狀態代碼。如果我將它從passthrough設置回auto,IIS將再次獲取錯誤頁面,並且不再顯示ColdFusion錯誤。

任何人都有解決方案嗎?我做了一些研究並「懷疑」JWildcardhandler可能是問題所在,但我找不到解決方案。

非常感謝!

+1

認爲好主意應該是顯示web.config的示例 – Sergii 2011-02-11 11:23:36

+1

IIS中的默認文檔是否設置爲index.cfm?如果它位於index.aspx或index.htm然後它可能試圖通過404錯誤通過沒有在ColdFusion上的404錯誤 – 2011-02-11 13:01:52

+0

在網站的IIS屬性,看看404錯誤處理程序頁面設置爲什麼。 – eapen 2011-02-11 14:14:13

回答

22

如果你想知道這個人的web配置可能看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <httpErrors existingResponse="PassThrough" /> 
     ... 
    </system.webServer> 
</configuration> 

在IIS的早期版本中,如果您的自定義腳本返回一個錯誤代碼,IIS忽略它,讓它通過。 但是您也可以將其設置爲使用自定義腳本處理錯誤狀態。

在我的舊服務器,如果給定的URL是404,IIS的建立是爲了EXECUT /404.cfm,其中顯示一個錯誤頁返回使用<cfheader> 404個狀態碼。

但是,現在如果該腳本返回404狀態碼,最終結果是IIS返回服務器錯誤,而不是返回帶有404狀態碼的響應。

避免這種情況的唯一方法是使用existingResponse="PassThrough",然後使用在CFAdmin中設置的站點範圍的「模板未找到」模板。

以下是有趣的部分。我將index.cfm設置爲默認索引,並且只有默認索引,用於我的網站。

如果我去/about//about/index.cfm存在,那麼它呈現該頁面,就好像我已經要求它爲/about/index.cfm。 如果我去/about/index.cfm/about/index.cfm確實不是存在,它會執行站點範圍內的404模板。

如果我去/about//about/不存在作爲一個URL,它試圖加載/about/index.cfm,從而引發站點範圍內的404模板。相反,它呈現一個空白頁面!

據我所知,這個問題沒有可行的解決方案。看起來只有使用.Net編寫的人才能解決這個問題,因爲他們可以在響應中放置一個標誌,它們生成的字面意思是告訴IIS「忽略狀態碼」。我認爲微軟對支持備用Web應用程序並不感興趣。

基本上,這是解決方案: 擺脫existingResponse="PassThrough"和返回錯誤的狀態碼

其他任何事情都太難實施。請注意,如果您正在製作RESTful應用或API,則這不起作用。在這種情況下,您必須爲此創建一個虛擬目錄,您可以爲其分配一個自定義web.config文件,其中使用使用existingResponse="PassThrough"。但是,如果您需要能夠允許自定義錯誤處理和自定義404處理,那麼您將被有效地使用。

好消息是,除了API和Ajax之外,唯一一個有人會關心狀態代碼的實際情況是當他們看着你的標題時,在這種情況下,他們會看到你運行IIS,只是爲你感到難過。

4

保持到位直通,你可以使用一個重寫來處理空白頁:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /404.cfm [NC,L,NS] 

重寫基本上意味着 - 如果文件和目錄不存在,重定向到「404.cfm還包括。 404.cfm頁面上的404 cfheader