6

通信と応答本文に HTTP 応答コードを使用する PHP アプリケーションを開発しています。したがって、これは PHP コードの典型的なシナリオです。

try {
    doSomething();
}
catch (Exception $e) {
    header('HTTP/1.1 500 Internal Server Error');
}

...そしてクライアントの典型的なコードは次のようになります:

switch(responseCode) {
     case 200 :
         // all fine
         // ....
     case 500 :
         // trouble!
 } 

すべてのエラーが PHP コードで適切に捕捉されている限り、これはすばらしいことです。

問題: 何らかの理由で php コードでキャッチされないエラーまたは構文エラーのようなキャッチできないエラーが発生した場合、Apache は 200 OK を送信します。しかし、私は 500 Internal Server Error とは言いたくありません。たぶん.htaccessあたりかそこら。

4

3 に答える 3

2

もちろん、独自のエラーハンドラを作成することもできます。ただし、すべてのPHPエラーをキャッチできるわけではありません。たとえば、構文エラーでは、エラーハンドラーを含め、コードを実行することさえできません。

キャッチ可能なエラーを処理するには、auto_append_fileおよびauto_prepend_fileディレクティブを使用して、エラー処理コードコードを配置します。

キャッチできないエラーは別の問題です。PHPがFastCGIとして実行されている場合 500ステータスコードが自動的に生成されます。ただし、おそらく他のSAPI(Apacheモジュールなど)を介してPHPを実行している可能性があります。それについてはわかりません、ごめんなさい。(何か見つけたら報告します。)

于 2010-08-05T08:02:09.360 に答える
2

PHP が応答本文の最初のバイトをエコーするまで、応答ヘッダーは送信されません。それまでの間、ヘッダー (およびステータス コード) を変更できます。それを念頭に置いて、ここに解決策があります:

500スクリプトの最初と最後に応答コードを送信するようにスクリプトを設定します200。次に例を示します。

header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error');

if (rand(0, 1) == 1) {
    die("Script terminated prematurely");
}

header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
echo "Success";

200応答コードがコード内の 1 つの場所にのみ設定されていることを確認してください。

http_response_code注:の代わりに (PHP >= 5.4)を使用できますheader

于 2013-01-08T10:01:39.173 に答える
2

最近では、それはもはや問題ではありません - 5.3 PHP がついにエラーで 200 ではなく 503 を送信することを学習したためです。

エラー、5.2.4だったようです:

PHP エラーで空白ページの代わりに HTTP 500 を送信するようにエラー ハンドラーを変更しました。

display_errors = off動作させるには設定が必要です

PHP 5.4.5を使用したWindows Apache 2.4で正確な動作をしています

于 2013-01-08T10:09:26.540 に答える