web-dev-qa-db-fra.com

Comment envoyer un code d'état en PHP, sans conserver un tableau de noms d'état?

Tout ce que je veux faire, c'est envoyer un code d'état 404 Depuis PHP - mais de manière générique. Router::statusCode(404) et Router::statusCode(403) devrait fonctionner, ainsi que tout autre code d'état HTTP valide.

Je sais que vous pouvez spécifier un code d'état comme troisième paramètre pour header . Malheureusement, cela ne fonctionne que si vous spécifiez un string. Ainsi, appeler header('', false, 404) ne fonctionne pas .

De plus, je sais que l'on peut envoyer un code d'état via un appel header avec une ligne d'état: header('HTTP/1.1 404 Not Found')

Mais pour ce faire, je dois conserver un tableau de phrases de raison (Not Found) Pour tous les codes d'état (404). Je n'aime pas l'idée de cela, car c'est en quelque sorte une duplication de ce que PHP fait déjà lui-même (pour le troisième paramètre header).

Donc, ma question est: existe-t-il un moyen simple et propre d'envoyer un code d'état en PHP?

32
NikiC

Il existe une nouvelle fonction pour cela dans PHP> = 5.4.0 http_response_code

Faites simplement http_response_code(404).

Si vous avez une version PHP version inférieure, essayez header(' ', true, 404); (notez les espaces dans la chaîne).

Si vous souhaitez également définir la raison, essayez:

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

Le texte réel du code n'est pas pertinent. Vous pourriez faire

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

et il serait toujours considéré comme un 404 par le navigateur - c'est le code qui compte.

26
Marc B

Zend Framework a une solution packagée dans Zend_Http_Response

Zend_Http_Response::$messages contient:

/**
 * 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'
);

Même si vous n'utilisez pas le framework zend, vous pourriez être en mesure de l'exploiter pour un usage personnel.

16
Mike B

Ouais, fais juste ça ...

header('x', true, 404);

Le premier paramètre de chaîne peut être tout ce qui ne contient pas de :. PHP va alors remplacer et aller avec la phrase standard. Le deuxième paramètre spécifie "toujours remplacer", et le 3ème est le code d'état que vous voulez.

Les références:

4
Brad