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?
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');
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.
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.
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: