How to send a status code in PHP, without maintaining an array of status names?
All I want to do, is send a 404
status code from PHP - but in a generic fashion. Both Router::statusCode(404)
and Router::statusCode(403)
should work, as well as any other valid HTTP status code.
I do know, that you can specify a status code as third parameter to header
. Sadly this only works if you specify a string
. Thus calling header('', false, 404)
does not work.
Furthermore I know, that one can send a status code via a header
call with a status line: header('HTTP/1.1 404 Not Found')
But to do this I have to maintain an array of reason phrases (Not Found
) for all status codes (404
). I don't like the idea of this, as it somehow is a duplication of what PHP already does itself (for the third header
parameter).
So, my question is: Is there any simple and clean way to send a status code in PHP?
There is a new function for this in PHP >= 5.4.0 http_response_code
Simply do http_response_code(404)
.
If you have a lower PHP version try header(' ', true, 404);
(note the whitespace in the string).
If you want to set the reason phrase as well try:
header('HTTP/ 433 Reason Phrase As You Wish');
The actual text of the code is irrelevant. You could do
header('The goggles, they do nawtink!', true, 404);
and it'd still be seen as a 404 by the browser - it's the code that matters.
Zend Framework has a packaged solution in 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'
);
Even if you're not using zend-framework you might be able to break this out for personal use.
Yeah, just do this...
header('x', true, 404);
The first string parameter can be anything that doesn't contain a :
. PHP will then replace and go with the standard phrase. The second parameter specifies "always replace", and the 3rd is the status code you want.
References:
- http://www.php.net/manual/en/function.header.php
- http://gif.phpnet.org/frederic/programs/http_status_codes/