Все, что я хочу сделать, это отправить код статуса 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 заменит и пойдет со стандартной фразой. Второй параметр указывает «всегда заменить», а третий – код состояния, который вы хотите.
Рекомендации: