为什么Apache + Rails会为代码500吐出两个状态标题?

时间:2008-10-02 10:13:19

标签: ruby-on-rails ruby apache http-headers

我有一个rails应用程序,除了一件事情以外工作正常。

当我请求不存在的东西(即/not_a_controller_or_file.txt)并且rails抛出“No Route matches ...”异常时,响应就是这个(空行有意):

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中)


我忘了提及,错误是由“无路线匹配......”异常造成的

3 个答案:

答案 0 :(得分:2)

这是一个相当古老的主题,但是为了它的价值,我找到了一个很好的资源,其中包括对问题和解决方案的详细描述。显然这个bug会影响Rails&lt; 2.3与Mongrel一起使用时。

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:0)

这来自rails本身。

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

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