1

我的目标似乎很简单。

我希望 IIS 7.5 处理所有404 File Not Found 请求,无论是静态还是动态 (ColdFusion 9) 内容,并将用户定向到其自定义 404 HTML 页面。

我相信我需要的 IIS 设置是existingReponse=Replace,errorMode=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
4

2 回答 2

2

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

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

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

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

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

第 2 步:
在单个网站的 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'(或任何合适的路径)。保存您的工作。在屏幕右侧,单击Edit Feature Settings并确保将其设置为'Detailed Errors For Local Requests and Custom Error Pages for Remote Requests'。接下来,在 IIS 中访问处理程序映射并确保将 ColdFusion 处理程序设置为“文件”的路径类型(此步骤可能不是解决此问题所必需的,但符合 ColdFusion 锁定指南)。

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

怎么了?只有本地基于 IIS 的 Coldfusion 驱动的 404 模板正在执行... 一旦您在 IIS 中启用本地 ColdFusion 模板,全局 ColdFusion 模板就会被有效且完全禁用。但是可以如图所示更换。

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

于 2013-09-20T23:57:41.723 回答
1

更新 2/17/2015 - 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 处理程序。与您不同,我希望 ColdFusion 处理所有 404 错误,而不是静态 HTML 页面。这让我可以做几件事。当页面移动或重命名时,我可以使用 ColdFusion 404 处理程序来处理它并相应地重定向请求。甚至更改有利于搜索引擎索引的状态代码(301 和/或 302 代码)。如果我不希望它真的存在,我也可以创建快捷方式,记录错误、电子邮件错误等。

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

我从来没有找到一种方法来避免对不存在的 .cfm 模板进行重复的 404 处理,所以我在我的 ColdFusion 页面中添加了代码。(请注意,我可以这样做,因为 404 处理程序是 ColdFusion 页面,而不是静态 HTML 页面。)我只需要一种方法来区分何时从 IIS 处理程序和 ColdFusion 处理程序调用页面。我发现,每当 IIS 404 处理程序调用 ColdFusion 页面时,CGI.SCRIPT_NAME无论实际请求哪个页面,变量都是我的 ColdFusion 页面的文件名。(IIS 将请求的 URL 附加到查询字符串中的 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 缺少模板处理程序时,它不遵循正常的请求生命周期。IE 请求不调用Application.cfm 文件。因此,如果您在为缺少的模板处理程序设置的 ColdFusion 页面中使用应用程序变量,则需要小心。(对于这些请求,您始终可以只cfinclude使用 Application.cfm 文件。)当请求通过 IIS 404 处理程序时,它会像往常一样处理 Application.cfm 文件。我猜是因为 IIS 正在请求 .cfm 文件。

当使用 Application.cfc 的onMissingTemplate函数时,ColdFusion 管理员的设置被完全绕过,转而使用该函数。当这个函数被触发时,它也不会通过正常的请求生命周期。您还应该检查此函数中是否存在应用程序变量(如果您在函数中使用任何变量),因为这曾经困扰过我。

于 2013-09-06T14:37:12.920 回答