3

我在使用 IIS 中的自定义错误处理程序(执行 URL)在 Windows 2008 R2 x64 上的 ColdFusion 10 中正确处理 404 错误时遇到了困难。我已经在以前版本的 CF 中做到了这一点,没有任何问题。在 IIS 中,在网站功能下,我打开“错误页面”并将其设置为对所有 404 错误执行“/404.cfm”。

我遇到的问题是 404.cfm 页面的输出没有完全发送回浏览器,并且页面没有正确加载。有时我一无所获,有时我得到 1K,有时我得到更多。这是非常不一致的。

除了在 IIS 中设置 404.cfm 处理程序外,我还在 Application.cfm 中的 onMissingTemplate() 方法中调用它:

<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错误处理程序中,我正在调用:

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

...然后我输出一堆东西。

当我在 404.cfm 中删除对 cfheader 的调用时,错误处理程序会正确加载 [for ColdFusion requests]。那是因为没有任何东西通过 IIS - 相反,它只是通过 ColdFusion 中的 onMissingTemplate() 方法。但是,响应头给了我一个 200 状态码,这是一个问题!出于显而易见的原因,它需要是 404 状态码。

当我包含 cfheader 调用请求非 ColdFusion 页面时(IIS 将生成 404 状态代码),我的 404.cfm 处理程序的输出未完全返回到浏览器。我认为这与 IIS 采取行动有关。

我确实在 CF 错误数据库中报告了这一点,但我想知道我是否做错了什么。错误在这里:https ://bugbase.adobe.com/index.cfm?event=bug&id=3488063

4

5 回答 5

4

这个错误确实最终在 CF10 中修复,更新 11。请参阅http://blogs.coldfusion.com/post.cfm/coldfusion-10-update-11-an-update-with-50-fixes。它只是顺便提到它(“8. Web Container/Tomcat - CGI.server_port, IIS custom error handlers”),但它就在那里。

并且上面引用的错误报告也已更新,表明它已通过此更新修复。

但是让我提出一个警告:有些人说(在错误报告中)他们发现即使在应用更新之后问题也没有解决。

有一个很可能的解释:请注意,在应用更新 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,如果您仍然遇到问题,那么请在错误报告中报告确认这一点。也许可能还有其他东西可以解释,但我们想先排除这个问题。

于 2013-07-13T03:25:24.123 回答
1

我已经更新了错误基础错误,但将在这里重新迭代我的解决方法。

我能够通过使用 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。

于 2013-03-19T00:53:49.933 回答
0

我还没有找到更新 11 的工作。即使在连接器更新之后。另一个笨拙的修复:

<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) 页面。这很恶心,但似乎有效。

于 2013-07-31T09:36:59.600 回答
0

修复我在反复试验后想出的问题是在您在 iis7 中路径到的 custom404.cfm 中输入以下代码

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

然后在根目录中创建文件 my404.cfm(包含的路径需要是您的包含路径)

在 my404.cfm 文件中放置您的处理代码。但不要在该文件中的任何位置使用 <CFABORT>,因为它会导致连接被重置。

于 2014-01-08T04:26:21.473 回答
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>

...其中变量 fullpage 是 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 处理程序。请求的页面被传递到此方法中,然后我将其传递给 Attribute 范围内的 404 处理程序,并将我的 404 处理程序称为 cfmodule。因此,当请求的是 ColdFusion 页面时,这是一个完整的解决方案,而当请求的是非 CF 页面时,这只是部分解决方案(因为我们无法确定请求的文件)。

于 2013-09-16T16:41:10.503 回答