質問

私はHTTP200OK、またはいくつかの4XXまたは5XXコードのようなHTTP応答コード(ステータスコード)で応答を行う必要があるPHPスクリプトを持っています。

PHPでこれを行うにはどうすればよいですか?

役に立ちましたか?

解決

私はちょうどこの質問を見つけて、それがより包括的な答えを必要とすると思った:

php 5.4 これを達成する方法は3つあります。

あなた自身の応答コードの組み立て(PHP>= 4.0)

header() 関数には、HTTPの応答回線を検出し、それを交換する特別なユースケースがあります。カスタムワン

header("HTTP/1.1 200 OK");
.

しかし、これは(高速)CGI PHPのための特別な治療法を必要とする:

$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi')
    header("Status: 404 Not Found");
else
    header("HTTP/1.1 404 Not Found");
.

注: HTTP RFCによると理由句は、任意のカスタム文字列(標準に準拠しています)ですが、クライアントの互換性i はランダムな文字列を置くことをお勧めしません。そこに。

注: php_sapi_name() PHP 4.0.1

3RD引数への引数への引数(PHP>= 4.3)

その最初のバリアントを使用するときは明らかにいくつかの問題があります。私が思う最大のものは、それがPHPまたはWebサーバーによって部分的に解析され、文書化が不十分です。

4.3以降、header関数には、応答コードを幾分快適に設定できる3番目の引数がありますが、最初の引数が空でない文字列になる必要があります。ここに2つの選択肢があります:

header(':', true, 404);
header('X-PHP-Response-Code: 404', true, 404);
.

私は2番目の1つをお勧めします。最初のは私がテストしたすべてのブラウザでの作業をしていますが、いくつかのマイナーブラウザやWebクローラにはコロンのみが含まれているヘッダー行に問題がある可能性があります。 2番目のヘッダーフィールド名。バリアントはもちろん標準化されていないため、修正することができ、私はうまくいけば説明的な名前を選んだ。

http_response_code関数(PHP>= 5.4)

PHP 5.4でhttp_response_code() 機能を導入し、をたくさん作成しました簡単です。

http_response_code(404);
.

それはすべてです。

互換性

これは、5.4以下の互換性を必要としているが、「新規」http_response_code関数の機能を望んでいた場合に調理した機能です。私はPHP 4.3が十分な後方互換性以上のものであると思いますが、あなたはわからない...

// For 4.3.0 <= PHP <= 5.4.0
if (!function_exists('http_response_code'))
{
    function http_response_code($newcode = NULL)
    {
        static $code = 200;
        if($newcode !== NULL)
        {
            header('X-PHP-Response-Code: '.$newcode, true, $newcode);
            if(!headers_sent())
                $code = $newcode;
        }       
        return $code;
    }
}
.

他のヒント

残念ながら、@dualedによって提示された解決策にはさまざまな欠陥があることがわかりました。

  1. を使用して substr($sapi_type, 0, 3) == 'cgi' 高速CGIを検出するためにenoghではありません。PHP-FPM FastCGIプロセスマネージャを使用する場合, php_sapi_name() cgiではなくfpmを返します

  2. Fasctcgiとphp-fpmは、@Josh-usingによって言及された別のバグを公開します header('X-PHP-Response-Code: 404', true, 404); PHP-FPM(FastCGI)の下で正常に動作しますか

  3. header("HTTP/1.1 404 Not Found"); プロトコルがHTTP/1.1でない場合に失敗する可能性があります(例:'HTTP/1.0')。を使用して現在のプロトコルを検出する必要があります $_SERVER['SERVER_PROTOCOL'] (PHP4.1.0以降で利用可能

  4. 電話をかける場合は少なくとも2つのケースがあります http_response_code() 予期しない動作の結果:

    • PHPが理解できないHTTP応答コードに遭遇した場合、PHPはコードを同じグループから知っているコードに置き換えます。たとえば、「521Webサーバーがダウンしています」は「500内部サーバーエラー」に置き換えられます。他のグループ2xx、3xx、4xxからの他の多くの珍しい応答コードは、このように処理されます。
    • Php-fpmとnginx http_response_code()関数を持つサーバーでは、コードを期待どおりに変更することができますが、メッセージは変更されません。これにより、たとえば奇妙な「404OK」ヘッダーが発生する可能性があります。この問題は、ユーザーのコメントによってPHPのwebサイトでも言及されています http://www.php.net/manual/en/function.http-response-code.php#112423

参考までに、HTTP応答ステータスコードの完全なリストがあります(このリストには、IETF internet standardsおよび他のIETF Rfcのコードが含まれています。それらの多くは現在PHP http_response_code関数でサポートされていません): http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

このバグを簡単にテストするには、次のように呼び出します:

http_response_code(521);

たとえば、カスタムクライアントアプリケーションがサーバーを呼び出し、追加のHTTPコードが必要な場合、サーバーは"500Internal Server Error"HTTP応答コードを送信し、予期しないエラーが


私のソリューション(4.1.0以降のすべてのPHPバージョン用):

$httpStatusCode = 521;
$httpStatusMsg  = 'Web server is down';
$phpSapiName    = substr(php_sapi_name(), 0, 3);
if ($phpSapiName == 'cgi' || $phpSapiName == 'fpm') {
    header('Status: '.$httpStatusCode.' '.$httpStatusMsg);
} else {
    $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
    header($protocol.' '.$httpStatusCode.' '.$httpStatusMsg);
}

結論

http_response_code()実装はすべてのHTTP応答コードをサポートしているわけではなく、指定されたHTTP応答コードを同じグループの別のもので上書きする可能性があります。

新しいhttp_response_code()関数は、関連するすべての問題を解決するわけではありませんが、新しいバグを最悪のものにします。

@Dualedが提供する「互換性」ソリューションは、少なくともPHP-FPMでは期待どおりに機能しません。

@Dualedが提供する他のソリューションにもさまざまなバグがあります。高速CGI検出はPHP-FPMを処理しません。現在のプロトコルを検出する必要があります。

任意のテストやコメントは大歓迎です。

PHP 5.4以降、GETHER STATUSコードを取得および設定するにはhttp_response_code()を使用できます。

例:

<?php

// Get the current response code and set a new one
var_dump(http_response_code(404));

// Get the new response code
var_dump(http_response_code());
?>
.

PHP.NET:

のこの関数の文書です。

http_response_code

出力バッファリングを使用していない場合は、ボディの出力の前にこの行を追加してください。

header("HTTP/1.1 200 OK");
.

メッセージ部分( 'OK')を適切なメッセージと交換し、必要に応じてステータスコードを適切な場合(404,501など)

環境をロードするときに404のWordPressを与えるためにここにいる場合、これは問題を解決するべきです:

define('WP_USE_THEMES', false);
require('../wp-blog-header.php');
status_header( 200 );
//$wp_query->is_404=false; // if necessary
.

問題は、ステータスを送信することができます.404は見つかりませんヘッダーが見つかりません。あなたはそれを上書きする必要があります。 これも機能します。

define('WP_USE_THEMES', false);
require('../wp-blog-header.php');
header("HTTP/1.1 200 OK");
header("Status: 200 All rosy");
.

header 関数で

それがかかる最初のパラメータのセクションには例があります。

あなたのバージョンのPHPにこの機能を含まない場合:

<?php

function http_response_code($code = NULL) {
        if ($code !== NULL) {
            switch ($code) {
                case 100: $text = 'Continue';
                    break;
                case 101: $text = 'Switching Protocols';
                    break;
                case 200: $text = 'OK';
                    break;
                case 201: $text = 'Created';
                    break;
                case 202: $text = 'Accepted';
                    break;
                case 203: $text = 'Non-Authoritative Information';
                    break;
                case 204: $text = 'No Content';
                    break;
                case 205: $text = 'Reset Content';
                    break;
                case 206: $text = 'Partial Content';
                    break;
                case 300: $text = 'Multiple Choices';
                    break;
                case 301: $text = 'Moved Permanently';
                    break;
                case 302: $text = 'Moved Temporarily';
                    break;
                case 303: $text = 'See Other';
                    break;
                case 304: $text = 'Not Modified';
                    break;
                case 305: $text = 'Use Proxy';
                    break;
                case 400: $text = 'Bad Request';
                    break;
                case 401: $text = 'Unauthorized';
                    break;
                case 402: $text = 'Payment Required';
                    break;
                case 403: $text = 'Forbidden';
                    break;
                case 404: $text = 'Not Found';
                    break;
                case 405: $text = 'Method Not Allowed';
                    break;
                case 406: $text = 'Not Acceptable';
                    break;
                case 407: $text = 'Proxy Authentication Required';
                    break;
                case 408: $text = 'Request Time-out';
                    break;
                case 409: $text = 'Conflict';
                    break;
                case 410: $text = 'Gone';
                    break;
                case 411: $text = 'Length Required';
                    break;
                case 412: $text = 'Precondition Failed';
                    break;
                case 413: $text = 'Request Entity Too Large';
                    break;
                case 414: $text = 'Request-URI Too Large';
                    break;
                case 415: $text = 'Unsupported Media Type';
                    break;
                case 500: $text = 'Internal Server Error';
                    break;
                case 501: $text = 'Not Implemented';
                    break;
                case 502: $text = 'Bad Gateway';
                    break;
                case 503: $text = 'Service Unavailable';
                    break;
                case 504: $text = 'Gateway Time-out';
                    break;
                case 505: $text = 'HTTP Version not supported';
                    break;
                default:
                    exit('Unknown http status code "' . htmlentities($code) . '"');
                    break;
            }
            $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
            header($protocol . ' ' . $code . ' ' . $text);
            $GLOBALS['http_response_code'] = $code;
        } else {
            $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);
        }
        return $code;
    }
.

We can get different return value from http_response_code via the two different environment:

  1. Web Server Environment
  2. CLI environment

At the web server environment, return previous response code if you provided a response code or when you do not provide any response code then it will be print the current value. Default value is 200 (OK).

At CLI Environment, true will be return if you provided a response code and false if you do not provide any response_code.

Example of Web Server Environment of Response_code's return value:

var_dump(http_respone_code(500)); // int(200)
var_dump(http_response_code()); // int(500)

Example of CLI Environment of Response_code's return value:

var_dump(http_response_code()); // bool(false)
var_dump(http_response_code(501)); // bool(true)
var_dump(http_response_code()); // int(501)
header("HTTP/1.1 200 OK");
http_response_code(201);
header("Status: 200 All rosy");

http_response_code(200); not work because test alert 404 https://developers.google.com/speed/pagespeed/insights/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top