Ruby on rails 为什么Apache+;Rails为代码500提供了两个状态头?
我有一个rails应用程序,除了一件事,它运行良好 当我请求一些不存在的东西时(即/not_a_controller_或_file.txt),rails抛出“No Route matches…”异常,响应如下(空行):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内
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的补丁
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>