web-dev-qa-db-ja.com

ステータス名の配列を維持せずに、PHPでステータスコードを送信する方法は?

やりたいことは、PHP-から一般的な方法で404ステータスコードを送信することです。Router::statusCode(404)Router::statusCode(403)の両方が動作するはずです、およびその他の有効なHTTPステータスコード。

header の3番目のパラメーターとしてステータスコードを指定できることは知っています。悲しいことに、これはstringを指定した場合にのみ機能します。したがって、header('', false, 404)を呼び出しても、notは機能しません。

さらに、header呼び出しを介してステータスコードを送信できることも知っています。header('HTTP/1.1 404 Not Found')

しかし、これを行うには、すべてのステータスコード(Not Found)の理由フレーズ(404)の配列を維持する必要があります。これは、PHPが既に3番目のheaderパラメーターに対して)行っていることの重複であるため、この考えは好きではありません。

だから、私の質問は次のとおりです。PHPでステータスコードを送信する簡単でクリーンな方法はありますか?

32
NikiC

このための新しい関数がPHP> = 5.4.0 _http_response_code_ にあります

単にhttp_response_code(404)を実行してください。

より低いPHPバージョンがある場合は、header(' ', true, 404);を試してください(文字列の空白に注意してください)。

理由フレーズも設定する場合は、次を試してください。

_header('HTTP/ 433 Reason Phrase As You Wish');
_
76
hectorct

コードの実際のテキストは無関係です。できる

header('The goggles, they do nawtink!', true, 404);

ブラウザからはまだ404として認識されます。重要なのはコードです。

26
Marc B

Zend Frameworkには、Zend_Http_Response

Zend_Http_Response::$messagesに含まれるもの:

/**
 * List of all known HTTP response codes - used by responseCodeAsText() to
 * translate numeric codes to messages.
 *
 * @var array
 */
protected static $messages = array(
    // Informational 1xx
    100 => 'Continue',
    101 => 'Switching Protocols',

    // Success 2xx
    200 => 'OK',
    201 => 'Created',
    202 => 'Accepted',
    203 => 'Non-Authoritative Information',
    204 => 'No Content',
    205 => 'Reset Content',
    206 => 'Partial Content',

    // Redirection 3xx
    300 => 'Multiple Choices',
    301 => 'Moved Permanently',
    302 => 'Found',  // 1.1
    303 => 'See Other',
    304 => 'Not Modified',
    305 => 'Use Proxy',
    // 306 is deprecated but reserved
    307 => 'Temporary Redirect',

    // Client Error 4xx
    400 => 'Bad Request',
    401 => 'Unauthorized',
    402 => 'Payment Required',
    403 => 'Forbidden',
    404 => 'Not Found',
    405 => 'Method Not Allowed',
    406 => 'Not Acceptable',
    407 => 'Proxy Authentication Required',
    408 => 'Request Timeout',
    409 => 'Conflict',
    410 => 'Gone',
    411 => 'Length Required',
    412 => 'Precondition Failed',
    413 => 'Request Entity Too Large',
    414 => 'Request-URI Too Long',
    415 => 'Unsupported Media Type',
    416 => 'Requested Range Not Satisfiable',
    417 => 'Expectation Failed',

    // Server Error 5xx
    500 => 'Internal Server Error',
    501 => 'Not Implemented',
    502 => 'Bad Gateway',
    503 => 'Service Unavailable',
    504 => 'Gateway Timeout',
    505 => 'HTTP Version Not Supported',
    509 => 'Bandwidth Limit Exceeded'
);

Zend-frameworkを使用していない場合でも、個人用にこれを分割できる場合があります。

16
Mike B

ええ、これをしてください...

header('x', true, 404);

最初の文字列パラメーターには、:を含まないものを指定できます。 PHPは標準フレーズに置き換えられます。2番目のパラメーターは「常に置き換える」を指定し、3番目は必要なステータスコードです。

参照:

4
Brad