2011-02-11 106 views
8

为了允许ColdFusion显示其错误而不仅仅是服务器错误(代码500),我已根据本网站中的一些发现添加到web.config中。Coldfusion错误和IIS7.5错误页面

问题看起来解决,但......

当我访问在IIS中不存在的目录,它返回一个“空白”页面没有任何状态代码。如果我将它从passthrough设置回auto,IIS将再次获取错误页面,并且不再显示ColdFusion错误。

任何人都有解决方案吗?我做了一些研究并“怀疑”JWildcardhandler可能是问题所在,但我找不到解决方案。

非常感谢!

+1

认为好主意应该是显示web.config的示例 – Sergii 2011-02-11 11:23:36

+1

IIS中的默认文档是否设置为index.cfm?如果它位于index.aspx或index.htm然后它可能试图通过404错误通过没有在ColdFusion上的404错误 – 2011-02-11 13:01:52

+0

在网站的IIS属性,看看404错误处理程序页面设置为什么。 – eapen 2011-02-11 14:14:13

回答

22

如果你想知道这个人的web配置可能看起来是这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <httpErrors existingResponse="PassThrough" /> 
     ... 
    </system.webServer> 
</configuration> 

在IIS的早期版本中,如果您的自定义脚本返回一个错误代码,IIS忽略它,让它通过。 但是您也可以将其设置为使用自定义脚本处理错误状态。

在我的旧服务器,如果给定的URL是404,IIS的建立是为了EXECUT /404.cfm,其中显示一个错误页返回使用<cfheader> 404个状态码。

但是,现在如果该脚本返回404状态码,最终结果是IIS返回服务器错误,而不是返回带有404状态码的响应。

避免这种情况的唯一方法是使用existingResponse="PassThrough",然后使用在CFAdmin中设置的站点范围的“模板未找到”模板。

以下是有趣的部分。我将index.cfm设置为默认索引,并且只有默认索引,用于我的网站。

如果我去/about//about/index.cfm存在,那么它呈现该页面,就好像我已经要求它为/about/index.cfm。 如果我去/about/index.cfm/about/index.cfm确实不是存在,它会执行站点范围内的404模板。

如果我去/about//about/不存在作为一个URL,它试图加载/about/index.cfm,从而引发站点范围内的404模板。相反,它呈现一个空白页面!

据我所知,这个问题没有可行的解决方案。看起来只有使用.Net编写的人才能解决这个问题,因为他们可以在响应中放置一个标志,它们生成的字面意思是告诉IIS“忽略状态码”。我认为微软对支持备用Web应用程序并不感兴趣。

基本上,这是解决方案: 摆脱existingResponse="PassThrough"和返回错误的状态码

其他任何事情都太难实施。请注意,如果您正在制作RESTful应用或API,则这不起作用。在这种情况下,您必须为此创建一个虚拟目录,您可以为其分配一个自定义web.config文件,其中使用使用existingResponse="PassThrough"。但是,如果您需要能够允许自定义错误处理和自定义404处理,那么您将被有效地使用。

好消息是,除了API和Ajax之外,唯一一个有人会关心状态代码的实际情况是当他们看着你的标题时,在这种情况下,他们会看到你运行IIS,只是为你感到难过。

4

保持到位直通,你可以使用一个重写来处理空白页:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /404.cfm [NC,L,NS] 

重写基本上意味着 - 如果文件和目录不存在,重定向到“404.cfm还包括。 404.cfm页面上的404 cfheader