Como enviar um código de status em PHP, sem manter uma série de nomes de status?

Tudo o que eu quero fazer é enviar um código de status 404 do PHP – mas de forma genérica. Tanto o Router::statusCode(404) como o Router::statusCode(403) devem funcionar, bem como qualquer outro código de status HTTP válido.

Eu sei, que você pode especificar um código de status como terceiro parâmetro para o header . Infelizmente, isso só funciona se você especificar uma string . Assim, o header('', false, 404) chamada header('', false, 404) não funciona.

Além disso, eu sei, que se pode enviar um código de status através de uma chamada de header com uma linha de status: header('HTTP/1.1 404 Not Found')

Mas para fazer isso, tenho que manter uma série de frases de razão ( Not Found ) para todos os códigos de status ( 404 ). Eu não gosto da idéia disso, uma vez que de alguma forma é uma duplicação do que o PHP já faz em si (para o terceiro parâmetro de header ).

Então, minha pergunta é: Existe alguma maneira simples e limpa de enviar um código de status no PHP?

Existe uma nova function para isso em PHP> = 5.4.0 http_response_code

Simplesmente faça http_response_code(404) .

Se você tiver uma versão mais baixa do PHP, tente o header(' ', true, 404); (anote o espaço em branco na string).

Se você deseja definir a frase de razão também, tente:

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

O texto real do código é irrelevante. Você poderia fazer

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

e ainda seria visto como um 404 pelo navegador – é o código que importa.

Zend Framework tem uma solução empacotada em Zend_Http_Response

Zend_Http_Response::$messages contains:

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

Mesmo se você não estiver usando o zend-framework, você poderá quebrar isso para uso pessoal.

Sim, faça isso …

 header('x', true, 404); 

O primeiro parâmetro de seqüência pode ser qualquer coisa que não contenha um : O PHP irá replace e seguir a frase padrão. O segundo parâmetro especifica “sempre replace”, e o 3º é o código de status desejado.

Referências: