13

Apacheがユーザーにスローする可能性のあるほとんどすべてのエラーをキャッチし、そのユーザーをエラーコントローラーにリダイレクトするために、.htaccessファイルに多数のErrorDocumentディレクティブがあります。これにより、エラーがよりユーザーフレンドリーな方法でレンダリングされます。しかし、それはうまくいかないようです。

たとえば、mysite.com / "" ## $ ## $!のような無効なURLを入力すると、errors.phpファイルへのリダイレクトではなく、常にApacheのデフォルトの403エラーメッセージが表示されます。以下は私が使用しているディレクティブです。それを機能させるために何か他のことをする必要がありますか?(AllowOverride Allが設定されています)

   ErrorDocument 403 /errors.php

これが絶対カスタムエラー処理にアプローチする間違った方法である場合は、私に知らせてください。正しい方向に微調整していただければ幸いです。

ありがとうございました!

編集:ああ、私がこれについて言及すると思っただけです。リクエストをリダイレクトするための独自のMVC構造を作成しましたが、これはうまく機能します。PHP内から、ユーザーが存在しないURLを要求した場合、私自身の404エラーは問題なく発生します(または私が定義した他のエラー)。つまり、基本的に、mysite.com/!!!!と入力すると URLに挿入すると、機能し、404が返されます。ただし、二重引用符でリクエストを開始すると、デフォルトのApache403エラーが発生します。奇数。また、500エラーはerrors.phpへのリダイレクトにも失敗し、デフォルトのApache 500画面を返すだけです(たとえば、header( "HTTP / 1.0 500 Internal Server Error"); die();)でテストする場合。

編集3:ErrorDocument 200 "message".htaccessファイルに入れようとしましたが、何も起こりませんでした。開いたページはすべて正常に開きます。最悪のシナリオでは、これは無限ループでスタックするはずです。最良のシナリオでは、「メッセージ」を出力する必要があります。それはどちらもしませんでした、それは単にErrorDocumentを無視しました。Apacheのアクセスログには通常の200OKヘッダーが記録されていますが、.htaccessでは完全に無視されていました。

4

2 に答える 2

28

質問のいくつかの異なる誤解。次のPHPコード:

header("HTTP/1.0 500 Internal Server Error");
die();

Apacheエラーページをトリガーすることはありません-ブラウザのデフォルトのエラーページをトリガーします。制御がPHPに渡されると、エラー処理のためにApacheに戻ることはありません。

ErrorDocumentはエラーコードに対してのみ機能し、成功コードに対しては機能しません。それはドキュメントにあります

Syntax: ErrorDocument error-code document

http://httpd.apache.org/docs/current/mod/core.html#errordocument

ある種類のブラウザエラーページをサーバーエラーと間違えた場合は、それが主な問題の原因である可能性もあります。カスタムエラーハンドラが一定量のデータを出力しない限り、一部のブラウザは常に独自のエラーページを表示します。出力のサイズが少なくとも数キロバイトであることを確認してください。

問題の原因は、Apacheの組み込みの動作と選択したテストURLの組み合わせにある可能性があります。ErrorDocumentドキュメントから:

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


編集: Apacheで500エラーをシミュレートする方法。私の最初の考えはの構文エラーでした.htaccessが、これはカスタムエラーハンドラーをトリガーしません。.htaccess私が見つけた最も簡単な方法は、次の行を追加してCGIを有効にすることでした。

ErrorDocument 500 /500.php
Options +ExecCGI
AddHandler cgi-script .pl

そして、クラッシュするperlスクリプトを追加します。

#!/usr/bin/perl
safasfdsfdd_(*EYFIUOBAF(_*AS^FD_(*AWHD{

perlスクリプトがapacheのユーザーによって実行可能であることを確認する必要があります。これは私のカスタム500ハンドラーを示しています。

ただし、PHPを使用しているときにApache 500をトリガーする可能性は非常に低いため、これはおそらく有用なテストではありません。

于 2011-04-30T02:34:54.873 に答える
-10

すべてのカスタムエラーページに.htaccessを使用しています

ErrorDocument 401 /error/PHP/server-error.php?error=401

ErrorDocument 403 /error/PHP/server-error.php?error=403

ErrorDocument 404 /error/PHP/server-error.php?error=404

ErrorDocument 500 /error/PHP/server-error.php?error=500

ErrorDocument 503 /error/PHP/server-error.php?error=503
于 2011-07-06T01:54:52.543 に答える