我有一个 Rails 应用程序,除了一件事之外工作正常。

当我请求不存在的东西时(即/not_a_controller_or_file.txt)并且rails抛出“没有路由匹配...”异常,响应是这样的(故意的空行):

HTTP/1.1 200 OK
Date: Thu, 02 Oct 2008 10:28:02 GMT
Content-Type: text/html
Content-Length: 122
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive

Status: 500 Internal Server Error
Content-Type: text/html

<html><body><h1>500 Internal Server Error</h1></body></html>

我在 /vendor 中有 ExceptionLogger 插件,但这似乎不是问题。除了公开的自定义 500.html 之外,我没有添加任何错误处理(尽管响应不包含该 HTML),而且我不知道这段 html 来自哪里。

所以某件事,某处正在添加 HTTP/1.1 200 状态码太早,或者 地位:500 为时已晚。我怀疑它是 Apache,因为当我使用 Webrick 时,我得到了适当的 HTTP/1.1 500 标头(位于顶部)。

我的生产堆栈如下:Apache 2杂种(5个实例)Rubyonrails 2.1.1(发生在1.2和2.1.1中)


我忘了提及, 该错误是由“没有路由匹配...”异常引起的

有帮助吗?

解决方案

这是一个相当古老的线程,但就其价值而言,我找到了一个很好的资源,其中包括问题和解决方案的详细描述。显然,当与 Mongrel 一起使用时,这个错误会影响 Rails < 2.3。

其他提示

这个html文件来自Rails。它遇到某种错误(可能是某种异常或其他一些不可恢复的错误)。

如果Status:标题和实际标题之间存在额外的空白行,而不仅仅是拼写错误,那么这将解释为什么Apache会报告200 OK消息。

Status标头是Rails,PHP或其他什么告诉Apache <!>的方法;出现错误,请返回此代码而不是200 OK。<!> quot;事实上有一个空行表示正在进行额外的操作,而Ruby在出错之前输出一个空行,无论出于何种原因。也许它是您脚本的先前输出。但它的长短不一,额外的空行意味着Apache认为<!>“哦,空行,没有额外的标题,现在这都是内容。<!>”,这与内容一致你提供的-Length标题。

我猜测为什么有一个空行是前一个脚本输出,也许是一个在完整脚本页面结尾处结束的行。至于500错误发生的原因,这里没有足够的信息告诉你。可能是文件I / O错误。

编辑:鉴于Dave提供的关于内部的额外信息,我会说这实际上是幕后发生的代理问题......我无法告诉你确切地说,除了已经说过的内容之外。

这来自rails本身。

http://github.com /rails/rails/tree/master/actionpack/lib/action_controller/dispatcher.rb#L60

调度程序返回错误页面,状态代码为200(成功)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top