Как отправить код состояния в PHP, не поддерживая массив имен статусов?

Все, что я хочу сделать, это отправить код статуса 404 с PHP, но в общем виде. Должны работать как Router::statusCode(404) и Router::statusCode(403) , а также любой другой действительный код состояния HTTP.

Я знаю, что вы можете указать код состояния в качестве третьего параметра для header . К сожалению, это работает только при указании string . Таким образом, вызов header('', false, 404) не работает.

Кроме того, я знаю, что можно отправить код состояния через вызов header с header состояния: header('HTTP/1.1 404 Not Found')

Но для этого я должен поддерживать множество разных фраз ( Not Found ) для всех кодов состояния ( 404 ). Мне не нравится идея этого, так как это как-то дублирует то, что PHP уже делает сам (для третьего параметра header ).

Итак, мой вопрос: есть ли простой и чистый способ отправить код состояния в PHP?

Для этого в PHP> = 5.4.0 есть новая функция http_response_code

Просто сделайте http_response_code(404) .

Если у вас более низкая версия PHP, попробуйте header(' ', true, 404); (обратите внимание на пробелы в строке).

Если вы хотите установить также причину, попробуйте:

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

Фактический текст кода не имеет значения. Вы могли бы сделать

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

и он все равно будет отображаться браузером как 404 – это важный код.

Zend Framework имеет пакетное решение в Zend_Http_Response

Zend_Http_Response::$messages содержит:

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

Даже если вы не используете zend-framework, вы можете разбить его для личного использования.

Да, просто сделай это …

 header('x', true, 404); 

Первым параметром строки может быть любое, что не содержит : Затем PHP заменит и пойдет со стандартной фразой. Второй параметр указывает «всегда заменить», а третий – код состояния, который вы хотите.

Рекомендации: