IIS7显示其自己的404消息& CF9消息;应该展示自己的

时间:2013-08-14 16:40:31

标签: iis-7 coldfusion static http-status-code-404 coldfusion-9

我的目标看似简单。

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

我相信我需要的IIS设置是existingReponse=ReplaceerrorMode=Custom,以及为404指定的文件路径。这就是我所做的。

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

我尝试过各种替代配置,每种方法似乎都有问题。

任何想法为什么IIS无法取代ColdFusion的404消息? ColdFusion无法与IIS(通过适当的标头)通信它正在发送404吗? IIS是否顽固?为什么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

2 个答案:

答案 0 :(得分:2)

这实际上应解决有关ColdFusion和IIS 7.5的多个问题/问题。在运行CF9 Standard的新的Win2k8 R2 / 64位服务器上,这解决了双IIS和CF错误模板显示的问题,无需设置IIS向公众显示详细的错误消息,并向客户端返回正确的错误代码浏览器。

除非您有特定的理由取消选中它,否则请在CF管理员的设置屏幕中选中ColdFusion的启用HTTP状态代码框,以便CF可以正确地将状态代码返回到IIS(某些404解决方案的工作方式是取消选中此框而代价是丢失那些有用的标题)。

第1步:
在CF管理员中配置缺少模板处理程序。我的服务器是全局的,并保存在ColdFusion webroot中 - 它与IIS Web根目录分开,其默认位置为c:\ ColdFusion9 \ wwwroot。此全局模板为404handler.cfm,包含以下简单代码,您可以对其进行扩展:

<h1>404</h1>
<p>Page Not Found</p>
<cfheader
    statuscode="404"
    statustext="Not Found">

此时,请访问您的网站并执行错误的ColdFusion网址: http:// [domain] /bogus.cfm 。您将看到IIS远程错误屏幕/横幅,然后是ColdFusion错误屏幕。检查标题,它是404.下一步将解决双显示问题。

第2步:
在单个Web站点的Web根目录下的某处创建本地404处理程序。我将此文件命名为'local404.cfm'。它由以下内容组成:

<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">

转到IIS管理器并单击您的个人网站。单击错误页面并编辑此站点的404处理程序。将其设置为执行URL并使url '/ local404.cfm'(或任何适当的路径)。保存你的工作。在屏幕右侧,单击编辑功能设置,并确保将其设置为'本地请求的详细错误和远程请求的自定义错误页'。接下来,仍然在IIS中访问处理程序映射并确保您的ColdFusion处理程序设置为'文件'的路径类型(此步骤可能不是解决此问题所必需的,但是符合ColdFusion Lockdown准则。)

再次执行错误的ColdFusion网址: http:// [domain] /bogus.cfm 。这次只能看到ColdFusion错误屏幕。检查标题,它是404.对非CF 允许的 URL执行相同操作,例如 http:// [domain] / bogus。 htm < / em>和不允许之类的 http:// [domain] /web.config 。在所有情况下,您都应该看到本地错误模板正在执行,并且正在发出404正确的标题。

发生了什么事?仅执行基于IIS的本地Coldfusion驱动的404模板...只要在IIS中启用本地ColdFusion模板,就会有效且完全禁用全局ColdFusion模板。但是它可以如图所示进行更换。

将上述内容应用于服务器上的所有网站,您可以删除全局CF缺失模板处理程序。单个全局模板更可取,但此方法解决了问题提供完整功能而不会产生安全性或SEO问题。

答案 1 :(得分:1)

2015年2月17日更新 - Adob​​e在自己的博客上证实了我的怀疑,http://blogs.coldfusion.com/post.cfm/onmissingtemplate

<小时/> 我使用ColdFusion 9和IIS 7.5遇到了同样的情况。我等着回答,希望别人可以分享他们的配置,也因为我对我提出的“决议”不太满意。我将吞下自己的骄傲并发布我为这种情况所做的事情。随意发表评论。

首先是我的发现。自从我为此工作已经有一段时间了,但这是我记得的。在ColdFusion管理员的“服务器设置 - 设置”下,如果选中导致此情况的启用HTTP状态代码选项。此设置使ColdFusion服务器返回状态代码,如404(和其他)以及它的响应。因此,当IIS在ColdFusion处理之后收到404状态时,它还会处理它的404错误处理程序。如果未选中启用HTTP状态代码选项,则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状态代码选项(选中)。使用此设置,404页面将被调用两次,用于所有不存在的.cfm模板(来自IIS和CF处理程序),但只会为每个其他文件类型调用一次(仅限IIS处理程序)。

我从来没有找到办法避免对不存在的.cfm模板进行重复404处理,因此我将代码添加到了ColdFusion页面。 (请注意,我可以这样做,因为404处理程序是一个ColdFusion页面,而不是静态HTML页面。)我只需要一种方法来区分从IIS处理程序和ColdFusion处理程序调用页面的时间。我发现只要IIS 404处理程序调用ColdFusion页面,CGI.SCRIPT_NAME变量就是我的ColdFusion页面的文件名,无论实际请求的页面是什么。 (IIS将请求的URL附加到查询字符串中,并附加404;)当ColdFusion缺少模板处理程序调用页面时,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页面的顶部,我有这样的代码(它不是很漂亮,但似乎对我有用):

<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>

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

使用Application.cfc的 onMissingTemplate 函数时,ColdFusion管理员的设置完全被绕过,以支持该功能。触发此功能时,它也不会流经正常的请求生命周期。您还应检查此函数中是否存在Application变量(如果您在函数中使用任何变量),因为之前已经咬过我。