【问题标题】:Coldfusion Error and IIS7.5 Error PagesColdfusion 错误和 IIS7.5 错误页面
【发布时间】:2011-06-25 11:28:20
【问题描述】:

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

问题看起来已经解决了,但是...

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

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

非常感谢!

【问题讨论】:

  • 认为最好的办法是展示您的 web.config 示例。
  • 您在 IIS 中的默认文档是否设置为 index.cfm?如果它在 index.aspx 或 index.htm 上,那么它可能会尝试通过 404 错误而不在 ColdFusion 上出现 404 错误。
  • 在站点的 IIS 属性中,查看 404 错误处理程序页面设置的内容。
  • 我尝试将 IIS 中的默认文档设置为 index.cfm,删除所有其他默认文档,但它似乎仍然忽略它,返回一个空白页。太令人沮丧了。为什么不设置一个允许服务器完全按照 IIS7 之前的行为的设置?

标签: coldfusion iis-7.5


【解决方案1】:

如果有人想知道此人的网络配置可能如下所示:

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

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

在我的旧服务器上,如果给定的 URL 是 404,则 IIS 设置为执行 /404.cfm,这会显示错误页面并且使用 &lt;cfheader&gt; 返回 404 状态代码。

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

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

这是有趣的部分。我已将 index.cfm 设置为默认索引,并且为我的站点设置了 only 默认索引。

如果我转到/about/,并且/about/index.cfm 存在,那么它会呈现页面,就好像我向它询问了/about/index.cfm。 如果我去/about/index.cfm/about/index.cfm 不存在,它会执行站点范围的404 模板。

但是如果我转到 /about/ 并且 /about/ 不作为 URL 存在,它确实 尝试加载 @ 987654332@ 从而触发站点范围的 404 模板。相反,它会呈现一个空白页面!

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

基本上,这是解决方案: 去掉existingResponse="PassThrough" 并返回错误的状态码

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

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

【讨论】:

  • 天哪,这太糟糕了。任何更新?谢谢!
  • 我已经让它有时适用于 404,但不适用于任何其他状态代码。但它从来都不是真正一致的。
  • 我们有一个 CMS,所有请求都转到 root/index.cfm 页面。该页面处理 URL 并基于它加载模板。 (重写规则将 url 变成查询字符串)。当我在我的数据库 (404) 中找不到该页面时,我会加载自定义标题。但是,当 url 是 root/page.cfm 时,Google 说 404,Firebug/Chrome 也是如此。但是当 url 是 root/page/ Fetch 时,Google 说它自己是 301,但 Firebug/Chrome 仍然正确地告诉我 404。 stackoverflow.com/q/14368274/1229594 任何见解将不胜感激。
  • 干得好...我很高兴你成功了!我不打算深入研究这个,因为我有一种感觉,几天后就能解决问题。我们拭目以待!
  • 我来到这里时遇到了同样的问题,但我的解决方法是将“httpErrors”行添加到 web.config。
【解决方案2】:

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

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

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

【讨论】:

  • 为了模拟 IIS 在调用 404 处理程序时使用的 URL 格式(包括查询字符串“?404;original-404-url"RewriteRule .* /error_404.cfm\?404;http://%{HTTP_HOST}/$&amp;\?%{QUERY_STRING} [NC,L,NS],我修改了 RewriteRule,如下所示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多