4

1 つのことを除いて、正常に動作する 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ステータス コードを追加するのが早すぎるか、Status: 500を追加するのが遅すぎます。Webrick を使用すると、適切な HTTP/1.1 500 ヘッダー (上部) を取得するため、Apache であると思われます。

私のプロダクション スタックは次のとおりです。 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 メッセージを報告する理由を説明するのに大いに役立ちます。

Status ヘッダーは、Rails、PHP、または何でも Apache に「エラーが発生しました。200 OK の代わりにこのコードを返してください」と伝える方法です。空行があるということは何か特別なことが起こっていることを意味し、Ruby はなんらかの理由でエラー出力の前に空行を出力しています。たぶん、スクリプトからの以前の出力です。要するに、余分な空白行は、Apacheが「ああ、空白行、余分なヘッダーはありません。これはすべてコンテンツです。」と考えていることを意味します。これは、提供した Content-Length ヘッダーと一致します。

空白行がある理由についての私の推測では、以前のスクリプト出力であり、おそらく完全なスクリプト ページの最後で終わる行です。500 エラーが発生する理由については、それを伝えるのに十分な情報がここにはありません。ファイル I/O エラーの可能性があります。

編集: Dave から提供された内部に関する追加情報を考えると、これは実際には舞台裏で行われているプロキシの問題だと思います..

于 2008-10-02T10:35:00.060 に答える
0

これはレール自体から来ています。

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

ディスパッチャーは、ステータス コード 200 (成功) のエラー ページを返します。

于 2008-10-12T14:50:24.863 に答える