6

PHP 5.4 には新しい関数があることは知ってhttp_response_code()いますが、以前のバージョンでは、設定したばかりの応答コードをどのように取得するのでしょうか?

PHP から現在の HTTP 応答コードを取得する方法はありますか? に似ています。

私はこの必要があります:

 //sometime earlier
 header('HTTP/1.1 404 Not Found');


//sometime later, detect if error was set
$status = some_magic_way_to_find_status();

PHP 5.3以下でこれを行う方法はありますか?

4

3 に答える 3

4

編集: @Esailijaが書いたように:これが機能するためには、この関数を使用するためにすべてのヘッダー呼び出しを書き直す必要があることに注意してください

このコードは、マニュアル http://www.php.net/manual/en/function.http-response-code.php#107261で見つかりました。

<?php

    if (!function_exists('http_response_code')) {
        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;

        }
    }

?>
于 2012-08-24T15:41:19.330 に答える
1

それは不可能だと思います。

関数をラップすることができheader()ます:

function my_status_header($setHeader=null) {
    static $theHeader=null;
    //if we already set it, then return what we set before (can't set it twice anyway)
    if($theHeader) {return $theHeader;}
    $theHeader = $setHeader;
    header('HTTP/1.1 '.$setHeader);
    return $setHeader;
}

または、もちろん、いつでもPHP5.4にアップグレードできます。

于 2012-08-24T15:43:32.780 に答える
0

PHP 5.3 以前で使用する http コードを設定するには (次の名前のファイルを作成して、http_response_code.phpこのコンテンツを入れることができます):

/*Check if function is available (php5.3<)*/
if (false === function_exists('http_response_code')) {
    /* Fallback */

    function http_response_code($code = null)
    {
        static $currentStatus;

        if ($code === null) {
            if ($currentStatus !== null) {
                return $currentStatus;
            }

            $currentStatus = 200;

            if (empty($_SERVER['PHP_SELF']) === false &&
                preg_match('#/RESERVED\.HTTP\-STATUS\-(\d{3})\.html$#', $_SERVER['PHP_SELF'], $match) > 0)
            {
                $currentStatus = (int) $match[1];
            }
        } elseif (is_int($code) && headers_sent() === false) {
            header('X-PHP-Response-Code: ' . $code, true, $code);
            $currentStatus = $code;
        }

        return $currentStatus;
    }
}

使用する場合:

<?php

require 'foo/bar/http_response_code.php';

$code = http_response_code();
http_response_code(403);

echo 'Initial HTTP code: ', $code, '<br>', PHP_EOL;
echo 'Current HTTP code: ', http_response_code(), '<br>', PHP_EOL;

このコードは次を返します。

最初の HTTP コード: 200
現在の HTTP コード: 403


この関数は、予約済みの URL を使用してサーバー エラーをチェックします。作業には、次の構成を使用します。

.htaccess (アパッチ)

ErrorDocument 403 /error.php/RESERVED.HTTP-STATUS-403.html
ErrorDocument 404 /error.php/RESERVED.HTTP-STATUS-404.html

nginx

error_page 404 /RESERVED.HTTP-STATUS-404.html;
error_page 403 /RESERVED.HTTP-STATUS-403.html;

location ~ ^/RESERVED\.HTTP\-STATUS\-(403|404)\.html$ {
    rewrite ^/RESERVED\.HTTP\-STATUS\-(403|404)\.html$ /error.php$0 last;
}

IIS

<httpErrors errorMode="Custom">
    <remove statusCode="403" />
    <remove statusCode="404" />
    <error statusCode="403" path="/error.php/RESERVED.HTTP-STATUS-403.html" responseMode="ExecuteURL" />
    <error statusCode="404" path="/error.php/RESERVED.HTTP-STATUS-501.html" responseMode="ExecuteURL" />
</httpErrors>

error.php一例であり、必要に応じて変更できます。スクリプト ページで (error.php) を使用します。

<?php

require 'foo/bar/http_response_code.php';

echo 'Error page, status: ', http_response_code();

「テンプレート」をロードするには:

<?php

require 'foo/bar/http_response_code.php';

include 'template/error/http_' . $code . '.php';
于 2015-05-30T23:47:23.087 に答える