34
votes

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?

5
The simple and clean way is to send the proper header. Any other way (including using the 3rd parameter to header() IMHO) is dirty. There are not that many status codes, and they are well documented. What's not clean about doing a simple map?ircmaxell

5 Answers

78
votes

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');
26
votes

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.

17
votes

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.

4
votes

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:

0
votes

Your server's responses should reflect the context of the response to a client's request. Additionally you shouldn't bother with the excess text, simply return the HTTP status number.

header('HTTP/2.0 200');//Ok / successful response.
header('HTTP/2.0 301');//Permanent redirect
header('HTTP/2.0 400');//Client request error: Bad request (e.g. missing $_POST, $_GET).
header('HTTP/2.0 401');//Client request error: Not authenticated
header('HTTP/2.0 403');//Client request error: Authenticated, still lacking permission.
header('HTTP/2.0 404');//Client request error: File Not Found
header('HTTP/2.0 500');//Server error, general.