3

我在使用IIS中的自定義錯誤處理程序(執行URL)在Windows 2008 R2 x64上的ColdFusion 10中正確處理404錯誤時遇到困難。我已經在以前版本的CF中完成了這個任務,沒有任何問題。在IIS中,在網站功能下,我打開「錯誤頁面」並將其設置爲對所有404錯誤執行「/404.cfm」。在Win2k8 R2 x64上處理ColdFusion 10中404錯誤的問題?

我遇到的問題是404.cfm頁面的輸出沒有完全發送回瀏覽器,頁面無法正確加載。有時候我沒有收回任何東西,其他時候我得到1K,有時候我會得到更多。這是非常不一致的。

隨着設置在IIS中404.cfm處理,我也稱它在onMissingTemplate()方法中Application.cfm:

<cffunction name="onMissingTemplate" 
    returnType="boolean" 
    output="true"> 

    <cfargument name="thePage" type="string" required="true"> 

    <cftry> 

     <cfmodule template="../../../404.cfm" thePage="#Arguments.thePage#"> 

     <cfcatch> 
      <cfoutput><p>An error occurred</p></cfoutput> 
     </cfcatch> 

    </cftry> 

    <cfreturn true /> 
</cffunction> 

裏面我404.cfm錯誤處理程序,我m電話:

<cfheader statuscode="404" statustext="Not Found"> 

...然後我輸出一堆東西。

當我刪除對404.cfm中cfheader的調用時,錯誤處理程序正確加載[用於ColdFusion請求]。這是因爲沒有任何事情正在經歷IIS - 相反,它只是通過ColdFusion中的onMissingTemplate()方法。但是,響應標題給了我一個200狀態碼,這是一個問題!由於顯而易見的原因,它需要是404狀態碼。

當我包括cfheader電話,被請求非ColdFusion頁時(IIS將生成404個狀態碼),我404.cfm處理器的輸出不能完全返回到瀏覽器。我認爲這與IIS獲得行動有關。

我確實在CF錯誤數據庫中報告了這一點,但我想知道是否有什麼我做錯了。錯誤在這裏:https://bugbase.adobe.com/index.cfm?event=bug&id=3488063

+0

我看到這個完全相同的問題,還沒有一個決議。 – 2013-03-04 13:28:51

+0

你投了我提交的錯誤嗎?如果不是,我鼓勵你這樣做。 https://bugbase.adobe.com/index.cfm?event=bug&id=3488063 – Redtopia 2013-03-04 17:13:11

+1

我的確投了票。 – 2013-03-04 18:14:24

回答

1

我已經更新了bug基本錯誤,但會在這裏重新提供我的解決方法。

我能夠通過包裝使用CFSaveContent然後強行寫的內容長度的404處理器的內容雜牌修復: -

<cfsavecontent variable="thePage"> 
Your 404 code here 
</cfsavecontent> 
<cfcontent reset="Yes" type="text/html"><cfheader name="Content-Length" value="#len(thePage)#"><cfoutput>#thePage#</cfoutput><cfabort> 

注:我cfcontent通過對cfabort在一行這樣沒有額外的空白。

CF9似乎沒有設置內容長度標題,但它似乎沒有區別..然而,CF10 ... Tomcat不能在CF處理結束時添加魔術成分並將其傳遞給它回到IIS。

+0

這對非ColdFusion文件起作用......在您的解決方法中添加確實會返回內容和404狀態碼。我一直無法使它適用於ColdFusion文件,即使我刪除了Application.cfm中的onMissingTemplate方法。當我使用onMissingTemplate方法並調用時,不會返回任何內容。當我刪除它時,內容與狀態碼200一起返回。 – Redtopia 2013-03-19 16:47:29

4

這個錯誤確實最終被修正爲CF10,更新11.請參閱http://blogs.coldfusion.com/post.cfm/coldfusion-10-update-11-an-update-with-50-fixes。它只是在傳遞中提到它(「8. Web容器/ Tomcat-CGI.server_port,IIS自定義錯誤處理程序」),但它在那裏。

上面引用的錯誤報告也已更新,以表明它已修復此更新。

但讓我提供一個警告:有些人說(在錯誤報告中),即使在應用更新後,他們發現問題仍未修復。

有一個很可能的解釋:請注意,應用更新11後,您必須更新或重建IIS的Web連接器。欲瞭解更多信息,請參閱http://blogs.coldfusion.com/post.cfm/coldfusion-10-does-the-connector-need-to-be-re-installed-for-update-11。更具體地說,如果您查看coldfusion10 \ config \ wsconfig [nn \文件夾(其中nn是一個數字,其中包含多個文件夾),並且您的isapi_redirect.dll未在2013年5月發佈日期,那麼你還沒有完成所需的更新11,而且似乎仍然存在問題。

如果wsconfig下有多個這樣的文件夾,請務必更新所有連接器。如果這樣做後,重新啓動IIS也許,如果你仍然有問題,然後報告錯誤報告確認。也許還有別的可以解釋的,但我們首先要解決這個問題。

+0

謝謝...我做了更新,問題依然存在。我將嘗試更新IIS的連接器並查看會發生什麼情況。 – Redtopia 2013-07-22 18:27:15

+0

此更新絕對不適合我。我刪除並重新安裝了連接器(針對所有網站),並且出現嚴重的行爲不一致。在大多數情況下,我會收到連接重置錯誤(Firefox),並且Chrome會提示「此網站不可用」。我有一個網站,它的工作,但間歇性。 – Redtopia 2013-07-22 20:28:11

+0

看來有幾個人報告說問題沒有解決。我按照他們的要求給CF發送了一些日誌文件。我鼓勵人們將他們的發現報告給bug數據庫:bugbase.adobe.com/index.cfm?event=bug&id=3488063 – Redtopia 2013-07-29 18:32:12

0

我還沒有找到更新11的工作。即使連接器更新後。另kludgey修復:

<CFPARAM default="0" name="URL.r"> 
<CFPARAM default="0" name="URL.t"> 
<CFSET ErrUrl = "/cfm/global/404error.cfm"> 
<CFIF URL.r IS 0> 
<CFIF FindNoCase(".htm", CGI.HTTP_REFERER) GT 0> 
    <CFLOCATION url="#ErrUrl#?r=1&t=htm"> 
</CFIF> 
<CFIF FindNoCase(".cfm", CGI.HTTP_REFERER) GT 0> 
    <CFLOCATION url="#ErrUrl#?r=1&t=cfm"> 
</CFIF> 
    <CFLOCATION url="#ErrUrl#?r=1"> 
</CFIF> 
<CFIF URL.t IS "htm"> 
    <CFHEADER statuscode="404" statustext="Page Not Found"> 
</CFIF> 

放置在您的錯誤頁面的頂部(更改ErrUrl指向你的錯誤頁)同時適用於CFM和HTM(L)的網頁。這是毛病,但似乎工作。

+0

我的第一個想法是...這個目標是輸出錯誤頁面和404錯誤。此解決方案將重定向到錯誤頁面,但生成的頁面不會包含404錯誤代碼,這可能會影響抓取工具。但不知道。 – Redtopia 2013-08-05 19:16:41

0

在我的404處理器,我說:

<cfheader statuscode="404" statustext="Not Found"> 
<cfheader name="Connection" value="Close"> <!--- this is the fix! ---> 

關閉連接,似乎出於某種原因。

並輸出的頁面,我做:

<cfcontent reset="Yes" type="text/html"> 
<cfheader name="Content-Length" value="#Len(fullpage)#"> 
<cfoutput>#fullpage#</cfoutput> 

...其中變量全頁是404處理器的內容。

現在我可以始終返回一個404狀態代碼錯誤和我的錯誤頁面的全部內容。但是,當請求非ColdFusion頁面時,CGI值不正確。在CF10之前,我可以通過查看CGI參數,特別是CGI.query_string,看起來像:「404; http://www.example.com/some/file.html「現在我得到:」404; http://www.example.com/jakarta/isapi_redirect.dll「,這使得不可能獲得所請求的頁面。

但是,現在我可以返回整個文檔的事實使得這個問題至少有部分解決方法,它仍然是開放的(在CF10發佈一年多後)!現在,我不是試圖找出請求的頁面,而是查看我的站點地圖,我只是輸出標準的「找不到頁面」錯誤。

我還應該提到我在Application.cfc的onMissingTemplate方法中使用了相同的404處理程序。被請求的頁面被傳遞到這個方法中,然後我將它傳遞給屬性作用域中的404處理程序,並將我的404處理程序作爲cfmodule調用。所以這是一個完整的解決方案,當它是一個ColdFusion頁面被請求的時候,並且當請求一個非CF頁面時(因爲我們不能確定所請求的文件),這只是一個部分的解決方案。

+1

有關丟失的請求文件名的更多信息,請參閱此文件 - [ColdFusion 10 + IIS:CFM文件的非存在URL。執行404頁後檢索原始URL](http://stackoverflow.com/q/18694932/1636917) – 2013-09-16 16:52:29

+0

我看了一下那個線程,看起來唯一的解決方法是將Ionic IIS重定向器安裝爲第三方ISAPI應用程序。 – Redtopia 2013-09-16 17:12:32

+0

我不知道這是否是唯一的解決方法,但有幾個人已經做到了。你有沒有注意到他們也使用Adobe輸入了這個錯誤。我有興趣看看他們如何回覆。如果沒有別的,也許他們可以回覆他們推薦的配置來檢索請求的頁面。如果您尚未對此bug進行投票 - https://bugbase.adobe.com/index.cfm?event=bug&id=3630245。 – 2013-09-16 17:15:24

0

修復我想出了試用後和錯誤 是你已經在IIS7 徑處理的custom404.cfm把下面的代碼

<cfinclude template="/inc_mypathtoroot/my404.cfm"> 
<cfheader name="Connection" value="Close"> 

然後創建在根文件my404.cfm(包含的路徑將需要成爲包含路徑)

my404中。cfm文件把你的處理代碼。 但不要使用< CFABORT>在任何地方,因爲它會導致連接被重置。