Iis 7 IIS7显示其自身的404消息和;CF9消息;应该只显示它自己

Iis 7 IIS7显示其自身的404消息和;CF9消息;应该只显示它自己,iis-7,coldfusion,static,http-status-code-404,coldfusion-9,Iis 7,Coldfusion,Static,Http Status Code 404,Coldfusion 9,我的目标似乎很简单 我希望IIS 7.5处理所有未找到文件的404请求,无论是静态还是动态(ColdFusion 9)内容,并将用户引导到其自定义404 HTML页面 我相信我需要的IIS设置是existingresponse=Replace,errorMode=Custom,以及为404指定的文件路径。我就是这么做的 通过安装ColdFusion 10,它可以正常工作。对于ColdFusion 9,由于某种原因,静态IIS 404响应和ColdFusion 404响应都被发送到客户端并显示。很

我的目标似乎很简单

我希望IIS 7.5处理所有未找到文件的404请求,无论是静态还是动态(ColdFusion 9)内容,并将用户引导到其自定义404 HTML页面

我相信我需要的IIS设置是
existingresponse=Replace
errorMode=Custom
,以及为404指定的文件路径。我就是这么做的

通过安装ColdFusion 10,它可以正常工作。对于ColdFusion 9,由于某种原因,静态IIS 404响应和ColdFusion 404响应都被发送到客户端并显示。很奇怪

我已经尝试了各种不同的配置,每种方法似乎都有一些问题

你知道为什么IIS不能取代ColdFusion的404消息吗?ColdFusion是否无法(通过适当的头)与IIS通信它正在发送404?是不是很固执?为什么ColdFusion 10和ColdFusion 9会有所不同

ColdFusion 9,通过CFAdmin

Global Settings
- Missing Template Handler = [no path specified]
IIS 7,通过IIS管理器

Configuration Editor -> system.webServer/httpErrors

    - allowAbsolutePathWhenDelegated = false
    - defualtPath  =  [no path specified]
    - defaultResponseMode = File
    - errorMode = Custom
    - existingResponse = Replace

Configuration Editor -> system.webServer/httpErrors -> Edit Collection

    - 404 Error
        path = [DriveLetter]:\inetpub\wwwroot\CAES\global\errorHandling\404.html
        prefixLanguageFilePath = [none specified]
        respnseMode = File
        statusCode = 404
        subStatusCode = -1
    - 403 Error
        path = [DriveLetter]:\inetpub\wwwroot\CAES\global\errorHandling\403.html
        prefixLanguageFilePath = [none specified]
        respnseMode = File
        statusCode = 404
        subStatusCode = -1

2015年2月17日更新-Adobe在他们自己的博客上证实了我的怀疑


我在使用ColdFusion 9和IIS 7.5时遇到了同样的情况。我等着回答,希望其他人能分享他们的配置,也因为我对自己提出的“解决方案”不太满意。我会放下我的骄傲,公布我为这种情况所做的一切。请随意评论

首先是我的发现。我已经有一段时间没做这件事了,但我想起来了。在ColdFusion管理员中的“服务器设置-设置”下,如果选中“启用HTTP状态代码”选项,则会出现这种情况。此设置导致ColdFusion服务器返回状态代码,如404(和其他)以及响应。因此,当IIS在ColdFusion处理之后收到404状态时,它也会处理404错误处理程序。如果未选中EnableHTTP status codes选项,则ColdFusion将为所有错误(包括500个错误)发送200 OK状态。当IIS收到200状态时,它假定一切正常,不处理其错误处理程序。这可能是一些人想要的;拥有ColdFusion进程本身的错误和IIS本身的错误-分别。但是,不返回实际的404状态代码可能会对搜索引擎索引造成不利影响

像你一样,那不是我想要的。我希望IIS和ColdFusion共享同一个404处理程序。与您不同,我希望所有404错误都由ColdFusion处理,而不是静态HTML页面。这让我可以做几件事。当页面移动或重命名时,我可以使用ColdFusion 404处理程序处理该问题,并相应地重定向请求。甚至更改有利于搜索引擎索引的状态代码(301和/或302代码)。如果我不希望真的存在,我也可以创建快捷方式,记录错误、电子邮件错误等

因此,在我的配置中,IIS的404错误指向我的ColdFusion页面。在ColdFusion管理员中,缺少的模板处理程序指向同一ColdFusion页面,并且启用了启用HTTP状态码选项(选中)。使用此设置,对所有不存在的.cfm模板(从IIS和CF处理程序)调用404页两次,但对其他文件类型(仅从IIS处理程序)调用404页一次

我从来没有找到一种方法来避免对不存在的.cfm模板进行重复的404处理,所以我在ColdFusion页面中添加了代码。(请注意,我可以这样做,因为404处理程序是一个ColdFusion页面,而不是一个静态HTML页面。)我只需要一种方法来区分从IIS处理程序调用页面与从ColdFusion处理程序调用页面的时间。我发现,每当IIS 404处理程序调用ColdFusion页面时,
CGI.SCRIPT\u NAME
变量就是我的ColdFusion页面的文件名,而不管实际请求的页面是什么。(IIS将请求的URL追加到查询字符串中的URL,前缀为404;)当ColdFusion missing template处理程序调用页面时,
CGI.SCRIPT_NAME
变量包含请求的ColdFusion模板的实际文件名

来自IIS 404处理程序的URL示例:

http://www.yourdomain.com/404handler.cfm?404;http://www.yourdomain.com:80/non-existent-file.cfm
示例URL表单ColdFusion缺少模板处理程序:

http://www.yourdomain.com/non-existent-file.cfm
知道了这一点,我现在可以在ColdFusion处理程序中包含一些代码,基本上忽略其中一个请求。我选择忽略ColdFusion请求,因为它们仅用于.cfm模板。IIS请求将针对所有文件。因此,在我的ColdFusion 404页面的顶部,我有这样的代码(虽然不太漂亮,但对我来说似乎很有用):


我注意到了另一件事。当请求通过ColdFusion missing模板处理程序发出时,它不会遵循正常的请求生命周期。即,请求不调用Application.cfm文件。因此,如果在为缺少的模板处理程序设置的ColdFusion页面中使用应用程序变量,则需要小心。(您可以始终为这些请求包含Application.cfm文件。)当请求通过IIS 404处理程序时,它会像通常一样处理Application.cfm文件。我猜是因为IIS正在请求.cfm文件


使用Application.cfc的onMissingTemplate函数时,为了支持该函数,将完全绕过ColdFusion管理员的设置。当启动此函数时,它也不会流经正常的请求生命周期。您还应该检查此函数中是否存在应用程序变量(如果您正在使用函数中的任何变量),因为这以前一直困扰着我。

这实际上应该解决多个有关ColdFusion和IIS 7.5的问题。在运行CF9标准的全新Win2k8 R2/64位服务器上,这解决了双I
<cfif CGI.SCRIPT_NAME NEQ "/404handler.cfm">
    <!--- Do some processing here if you want --->
    <!--- Basically we will ignore this request from the ColdFusion handler --->
<cfelse>
    <!--- This request is from the IIS handler --->
    <!--- All non-existent file types will come through here --->
    <!--- Do all of your processing here --->
</cfif>
<h1>404</h1>
<p>Page Not Found</p>
<cfheader
    statuscode="404"
    statustext="Not Found">
<h1>404</h1>
<p>Page Not Found (local)</p>
<!--- 
demonstrate ColdFusion is functional 
with some simple output 
--->
<cfoutput>
<p>#now()#<br>#cgi.server_name#</p>
</cfoutput>
<cfheader
    statuscode="404"
    statustext="Not Found">