为什么 Apache + Rails 会为代码 500 吐出两个状态标头?
-
03-07-2019 - |
题
我有一个 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。
- 帮助我理解问题的文章 & 编写我自己的补丁。
- 官方 Rails 错误单 其中包括 Rails 2.2.2 的补丁。
其他提示
这个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(成功)。