Как отправить код состояния в PHP, не поддерживая массив имен статусов?
Все, что я хочу сделать, это отправить код статуса 404
с PHP - но в общем виде. Должны работать как Router::statusCode(404)
, так и Router::statusCode(403)
, а также любой другой допустимый код статуса HTTP.
Я знаю, что вы можете указать код состояния в качестве третьего параметра header
. К сожалению, это работает, если вы укажете string
. Таким образом, вызов header('', false, 404)
не работает.
Кроме того, я знаю, что можно отправить код состояния с помощью вызова header
со строкой состояния: header('HTTP/1.1 404 Not Found')
Но для этого мне нужно поддерживать массив фраз разума (Not Found
) для всех кодов состояния (404
). Мне не нравится идея этого, так как это как-то дублирует то, что PHP уже делает сам (для третьего параметра header
).
Итак, мой вопрос: есть ли простой и чистый способ отправить код состояния в PHP?
Ответы
Ответ 1
В PHP есть новая функция для PHP >= 5.4.0 http_response_code
Просто сделайте http_response_code(404)
.
Если у вас более низкая версия PHP, попробуйте header(' ', true, 404);
(обратите внимание на пробелы в строке).
Если вы также хотите установить фразу причины, попробуйте:
header('HTTP/ 433 Reason Phrase As You Wish');
Ответ 2
Фактический текст кода не имеет значения. Вы могли бы сделать
header('The goggles, they do nawtink!', true, 404);
и браузер все равно будет выглядеть как 404 - это код, который имеет значение.
Ответ 3
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, вы можете разбить его для личного использования.
Ответ 4
Да, просто сделайте это...
header('x', true, 404);
Первым параметром строки может быть любое, что не содержит :
. Затем PHP заменит и пойдет со стандартной фразой. Второй параметр указывает "всегда заменить", а третий - код состояния, который вы хотите.
Литература: