为了让ColdFusion显示其错误而不仅仅是服务器错误(代码500),我已根据本网站的一些调查结果添加到web.config。
问题看起来已经解决,但......
当我访问IIS中的一个不存在的目录时,它返回一个没有任何状态代码的“空白”页面。如果我将它从passthrough设置回auto,IIS将再次获取错误页面,并且不再显示ColdFusion错误。
任何人都有解决方案吗?我做了一些研究并“怀疑”JWildcardhandler可能是问题,但我找不到解决方案。
非常感谢!
答案 0 :(得分:22)
如果有人想知道这个人的网络配置可能是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors existingResponse="PassThrough" />
...
</system.webServer>
</configuration>
在早期版本的IIS中,如果您的自定义脚本返回了错误代码,则IIS会忽略它并将其通过。 但您还可以将其设置为使用自定义脚本处理错误状态。
在我的旧服务器上,如果给定的URL是404,则IIS设置为执行/404.cfm,其显示错误页面并且使用{{1}返回404状态代码}。
但是,现在如果该脚本返回404状态代码,则最终结果是IIS返回服务器错误,而不是返回带有404状态代码的响应。
避免这种情况的唯一方法是使用<cfheader>
,然后使用在CFAdmin中设置的网站范围的“找不到模板”模板。
这是有趣的部分。我将index.cfm设置为默认索引,并将仅默认索引设置为我的网站。
如果我转到existingResponse="PassThrough"
,并且/about/
存在,那么它会呈现该页面,就好像我曾要求它/about/index.cfm
一样。
如果我转到/about/index.cfm
而/about/index.cfm
不,则会执行网站范围的404模板。
但 如果我转到/about/index.cfm
且/about/
不存在为网址,则不尝试加载/about/
,从而触发网站范围的404模板。相反,它呈现一个空白页面!
据我所知,此问题没有可行的解决方案。看起来只有用.Net编写的人才能解决这个问题,因为他们可以在他们生成的响应中放置一个标志,字面上告诉IIS“忽略状态代码”。我认为微软根本不支持备用Web应用程序。
基本上,这是解决方案:
摆脱/about/index.cfm
并返回错误的状态代码。
其他任何事情都难以实施。请注意,如果您正在制作RESTful应用程序或API,则此方法无效。在这种情况下,您必须为此创建一个虚拟目录,您可以为其分配 使用existingResponse="PassThrough"
的自定义web.config文件。但是,如果您需要能够允许自定义错误处理和自定义404处理,那么您就会被搞砸了。
好消息是,除了API和Ajax之外,当他们正在查看你的标题时,唯一有人会关心状态代码实际是什么,在这种情况下他们会看到你正在运行IIS,只是为你感到难过。
答案 1 :(得分:4)
保持传递到位,您可以使用重写来处理空白页:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /404.cfm [NC,L,NS]
重写基本上意味着 - 如果文件和目录不存在,则重定向到“404.cfm。还在404.cfm页面上包含404 cfheader。