web-dev-qa-db-ja.com

エラーに関係なく、HTTP 500コードを返す方法

APIとして呼び出される認証スクリプトをPHPで作成していますが、それ以外の場合は200 _only in the case that it approves the request, and_ 403 _(Forbidden) or_ 500`を返す必要があります。

私が直面している問題は、エラー状態の場合にphpが_200_を返し、代わりにエラーをhtmlとして出力することです。自分で明示的にHTTP _500_またはHTTP _200_を返さない限り、phpがHTTP _403_コードを返すことを確実に確認するにはどうすればよいですか?つまり、すべての警告またはエラー条件を例外なしの_500_ sに変換したいので、デフォルトのケースでは認証要求が拒否され、例外は_200_コードで承認されます。

私はset_error_handler()error_reporting()をいじりましたが、これまでのところ運はありません。たとえば、HTTP応答コードを送信する前にコードが何かを出力した場合、PHPは当然、出力後にヘッダー情報を変更できないと報告します。ただし、これはPHPとして、問題を説明するhtml付きの_200_応答コードとして。この種のものも_500_コードに変換する必要があります。

これはPHPで可能ですか?または、何らかの方法で_mod_rewrite_を使用するなど、より高いレベルでこれを行う必要がありますか?その場合、どのように設定するのでしょうか?

45
Jake

the PHP header for)のドキュメント をチェックしました。作成するよりも簡単です。2番目のパラメーターがtrueの場合、同様のヘッダーを置き換えます。デフォルトはtrueです。そのため、正しい動作はheader ('HTTP/1.1 403 Forbidden');、認証ロジックを実行し、認証された場合、ヘッダー('HTTP/1.1 200 OK')。 403応答を置き換え、403がデフォルトであることを保証します。

20
Jake

ステータスコードを応答として送信するだけです header()

header('HTTP/1.1 500 Internal Server Error');

これを送信するときは、その前に出力する必要はありません。つまり、echo呼び出しもHTMLも空白もありません。

75
BoltClock

PHP 5.4.0なので、特殊な機能があります:

<?php http_response_code( 500 ); ?>

他の出力の前に呼び出されることを確認してください。

参照:

15
Martin M

Set_error_handler()のphpページには、2003年9月8日10:28に投稿されたncoastsoft dot comのsmpによるコメントを見つけることができます。必要に応じてコードを変更しました:

error_reporting(E_ALL);
ini_set('display_errors', 'on');

function fatal_error_handler($buffer) {
    header('HTTP/1.1 500 Internal Server Error');
    exit(0);
}

function handle_error ($errno, $errstr, $errfile, $errline){
    header('HTTP/1.1 500 Internal Server Error');
    exit(0);
}

ob_start("fatal_error_handler");
set_error_handler("handle_error");

//would normally cause a fatal error, but instead our output handler will be called allowing us to handle the error.
somefunction();
ob_end_flush();

このしきい値は、存在しない関数の致命的なエラーをキャッチします。 500を返し、スクリプトの残りの実行を停止します。

11
2ndkauboy
header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');

内部サーバーエラーを示す500は使用しないでください。

出力バッファリングを有効にしている場合を除き、これ(および他のヘッダー)は出力の前に送信する必要があります。

4
Artefacto

Parseエラーで500を返すためにPHPを取得する方法を考えたことがありますか...まったく同じニーズがあります... APIはアプリに投稿されており、すべてが正しく処理されました...

解析エラーの場合、PHPはエラー200を返し、これらの関数の両方を使用しました。

register_shutdown_function()set_error_handler()

また、コードで「解析/構文」エラーが発生してもこれらはヒットしません...

したがって、これは低レベルのPHP関数であり、PHP.INIまたはどこかに設定する必要があります...私はPHP 5.3.10 ...

2
Patrick Steil

出力バッファリングを使用して、ページの本文への書き込み後にヘッダーを変更できるようにします。これは、すべてのスクリプトを更新するのではなく、 iniファイル で設定できます。

(出力バッファを明示的にフラッシュすると、header()呼び出しは失敗します)

C.

1
symcbean