4

我有一个运行良好的 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状态代码太早了,或者Status: 500太晚了。我怀疑它是 Apache,因为当我使用 Webrick 时,我得到了适当的 HTTP/1.1 500 标头(在顶部)。

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


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

4

3 回答 3

2

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

于 2010-04-21T14:12:50.560 回答
1

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

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

状态标头是 Rails、PHP 或任何告诉 Apache “发生错误,请返回此代码而不是 200 OK”的标题。有一个空行的事实意味着发生了一些额外的事情,并且 Ruby 出于某种原因在错误输出之前输出了一个空行。也许它是您脚本的先前输出。总而言之,额外的空白行意味着 Apache 认为“哦,空白行,没有额外的标题,这就是现在的所有内容。”,这与您提供的 Content-Length 标题一致。

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

编辑:鉴于 Dave 提供的有关内部的额外信息,我想说这实际上是幕后进行的代理的一个问题……除了已经说过的内容之外,我无法确切地告诉你是什么。

于 2008-10-02T10:35:00.060 回答
0

这是来自rails本身。

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

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

于 2008-10-12T14:50:24.863 回答