Ruby on rails 为什么Apache+;Rails为代码500提供了两个状态头?

Ruby on rails 为什么Apache+;Rails为代码500提供了两个状态头?,ruby-on-rails,ruby,apache,http-headers,Ruby On Rails,Ruby,Apache,Http Headers,我有一个rails应用程序,除了一件事,它运行良好 当我请求一些不存在的东西时(即/not_a_controller_或_file.txt),rails抛出“No Route matches…”异常,响应如下(空行): HTTP/1.1200正常 日期:2008年10月2日星期四10:28:02格林威治标准时间 内容类型:text/html 内容长度:122 改变:接受编码 保持活动状态:超时=15,最大=100 连接:保持活力 状态:500内部服务器错误 内容类型:text/html 500内

我有一个rails应用程序,除了一件事,它运行良好

当我请求一些不存在的东西时(即/not_a_controller_或_file.txt),rails抛出“No Route matches…”异常,响应如下(空行):

HTTP/1.1200正常
日期:2008年10月2日星期四10:28:02格林威治标准时间
内容类型:text/html
内容长度:122
改变:接受编码
保持活动状态:超时=15,最大=100
连接:保持活力
状态:500内部服务器错误
内容类型:text/html
500内部服务器错误
我在/vendor中有ExceptionLogger插件,尽管这似乎不是问题所在。除了custom 500.html之外,我还没有公开添加任何错误处理(尽管响应中不包含该html),我也不知道这段html是从哪里来的

因此,某处添加HTTP/1.1200状态代码太早,或者添加状态:500太迟。我怀疑它是Apache,因为我在使用Webrick时得到了适当的HTTP/1.1500头(在顶部)

我的生产堆栈如下所示: 阿帕奇2 杂种狗(5例) RubyOnRails 2.1.1(发生在1.2和2.1.1中)



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

此html文件来自Rails。它遇到了某种错误(可能是某种异常,或其他无法恢复的错误)

如果Status:header和实际的header之间有一个额外的空行,而不仅仅是一个输入错误,那么这将大大有助于解释为什么Apache报告一条200ok消息

状态标题是Rails、PHP或其他任何东西告诉Apache“出现错误,请返回此代码,而不是200 OK”。事实上,有一个空行意味着发生了额外的事情,Ruby出于任何原因在错误输出之前输出一个空行。也许这是您的脚本以前的输出。但长短不一的是,额外的空行意味着Apache认为“哦,空行,没有额外的标题,这就是所有的内容了。”这与您提供的内容长度标题是一致的

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


编辑:鉴于Dave提供的关于内部结构的额外信息,我认为这实际上是幕后代理的问题。。。除了已经说过的以外,我无法告诉您确切的情况。

这是来自rails本身


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

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

  • &编写我自己的修补程序
  • 其中包括Rails 2.2.2的补丁

换句话说,Ruby抛出一个异常,导致它失败,您会问它为什么显示错误?:/我不认为这是他的问题。。。他的问题是为什么Apache似乎认为请求成功。我也回答了这个问题,尽可能在没有看到任何代码的情况下回答。Ruby为什么输出一个空行,在没有看到代码的情况下无法回答。但这就是正在发生的事情,并导致Apache发送错误消息。在映射过程中,在控制器之前会发生“无路由匹配…”,因此我们不能在公共场合使用rescue_action_。我在rails的actionpack/lib/actioncontroller/dispatcher.rb:59(rails 2.1.1)中找到了打印状态头的行,但是为什么在状态代码之前还有一行?不知道。什么URL与路由不匹配?^Status:header定义在哪里?这是因为它不是HTTP头,而是CGI头。它应该被服务器捕获和使用,而不是被看到,第6.3.3节。但是apache和mongrel之间的桥梁是HTTP,而不是CGI。请参阅我对您对我的答案的评论的回复。这是不正确的,因为这不是它想要做的。Status是一个CGI头,格式良好。但是apache和mongrel之间的桥梁是HTTP,而不是mongrel和ruby之间的CGI?某个地方发生了CGI,因为这是一个CGI头,如果ruby没有通过CGI运行,那么它就没有理由使用这个头。无论如何,我的答案仍然是成立的,因为标题在某些地方已经脱节,因此空白行和重复内容类型的标题。看到这封邮件,杂种使用CGI与RoR对话:
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>