web-dev-qa-db-ja.com

htaccess ErrorDocument 500が機能しない

.htaccessファイルに含まれているサイトがあります:

ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html

404リダイレクトは正常に機能しますが、500内部サーバーエラーが発生すると、/errors/500.htmlではなくデフォルトの内部サーバーエラーメッセージが表示されます。それはまた言う

また、ErrorDocumentを使用して要求を処理しようとしたときに、500内部サーバーエラーエラーが発生しました。

詳細:htaccessファイルの残りの部分によって ".html"が削除された.htmlページに末尾のスラッシュを入力すると、500をスローできます(たとえば、testが実際にhttp://example.com/test/に移動しようとした場合test.html、次に内部サーバーエラーが発生します):

#example.com/page will display the contents of example.com/page.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

#302 from example.com/page.html to example.com/page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/
RewriteRule ^(.*)\.html$ /$1 [R=302,L]
6
binaryfunt

しかし、500内部サーバーエラーが発生すると、デフォルトの内部サーバーエラーが表示されます

問題は、カスタム500エラードキュメントが.htaccessのエラーに対してトリガーされないことです。これがここで発生しています。 Aakashがすでに引用しているように、これは「不正な要求」の領域に含まれる場合があります。エラーログを確認すると、「core:error」と表示されるはずです。

実際、カスタム500エラードキュメントをトリガーする実際のエラーをシミュレートするのは少し難しいです。

ただし、次のようなカスタムエラーハンドラーを呼び出す500エラーを手動でトリガーできます。

RewriteRule ^ - [R=500]

また、ErrorDocumentを使用して要求を処理しようとしたときに、500内部サーバーエラーエラーが発生しました。

確かに、この文言は少しわかりにくいです。ただし、すべてのシステム生成 500エラーには、この同じテキストが含まれているようです。 「リクエストを処理できなかった」ことを意味すると思います...リクエストを処理するためのErrorDocumentがなかったため、ここにcatch-all 500 Internal Server Errorがあります。 500エラーは実際には...未定義のエラー状態です。他に当てはまるものがないためです(詳細についてはサーバーエラーログを確認してください)。

詳細:「.html」が削除された.htmlページに末尾のスラッシュを入力すると、500をスローできます...

これが本当にあなたの質問の一部であるかどうかはわかりませんが、この500エラーは書き換えループの結果です。具体的には:

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

リクエスト:http://example.com/test/(追加のスラッシュ付き)

この場合、%{REQUEST_FILENAME}/path/to/test(末尾のスラッシュなし)であるため、条件%{REQUEST_FILENAME}.html -fは真です(/path/to/test.htmlは存在します)。

ただし、RewriteRuleパターンによってキャプチャされたURLパスには、末尾のスラッシュが含まれます。 test/-このインスタンスのREQUEST_FILENAMEとは異なります。したがって、URLはtest/.htmlに誤って書き換えられます。

そして、書き換えは(URLが変更されたため)上からやり直します... test/.html.htmltest/.html.html.htmlなど(REQUEST_FILENAMEは常に/path/to/testであるため)

2
MrWhite

私は2つのことを試してみます-

  1. 500.htmlのアクセス許可を確認します(非常に確実にするために、777に設定してみてください-後で変更します)。

  2. 500.htmlの代わりに500.htm(または500.txt)を試してください(htaccessの他のルールがErrorDocument 500.htmlページを台無しにしないようにするためです)。また、htaccess ErrorDocumentルールを500.htm(または500.txt)に変更することを忘れないでください。

また、 http://httpd.Apache.org/docs/2.4/mod/core.html#errordocument

ほとんどのエラーメッセージはオーバーライドできますが、ErrorDocumentの設定に関係なく内部メッセージが使用される特定の状況があります。特に、不正な形式の要求が検出された場合、通常の要求処理は直ちに停止され、内部エラーメッセージが返されます。これは、不正なリクエストに起因するセキュリティ問題を防ぐために必要です。

500エラーをシミュレートする他の方法を試してください。

2
Aakash