У меня есть PHP-скрипт, который должен давать ответы с помощью HTTP-кодов ответов (кодов состояния), таких как HTTP 200 OK или код 4XX или 5XX.
Как я могу сделать это в PHP?
источник
У меня есть PHP-скрипт, который должен давать ответы с помощью HTTP-кодов ответов (кодов состояния), таких как HTTP 200 OK или код 4XX или 5XX.
Как я могу сделать это в PHP?
Я только нашел этот вопрос и подумал, что нужен более полный ответ:
Начиная с PHP 5.4, есть три способа сделать это:
header()
Функция имеет специальный потребительной случай , который определяет линию ответа HTTP и позволяет заменить , что с пользовательской один
header("HTTP/1.1 200 OK");
Однако для этого требуется (Fast) CGI PHP:
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi')
header("Status: 404 Not Found");
else
header("HTTP/1.1 404 Not Found");
Примечание: Согласно HTTP RFC , фраза причины может быть любой произвольной строкой (которая соответствует стандарту), но ради совместимости с клиентом я не рекомендую помещать туда случайную строку.
Примечание: php_sapi_name()
требуется PHP 4.0.1
Очевидно, есть несколько проблем при использовании этого первого варианта. Самым большим из них, на мой взгляд, является то, что он частично анализируется PHP или веб-сервером и плохо документирован.
Начиная с 4.3, header
функция имеет 3-й аргумент, который позволяет вам несколько удобно установить код ответа, но для его использования требуется, чтобы первый аргумент был непустой строкой. Вот два варианта:
header(':', true, 404);
header('X-PHP-Response-Code: 404', true, 404);
Я рекомендую второй . Первый делает работу на все браузеры я тестировал, но некоторые незначительные браузеры или веб - сканеры могут иметь проблемы с линией заголовка , который содержит только двоеточие. Имя поля заголовка во 2-м. вариант, конечно, никак не стандартизирован и может быть изменен, я просто выбрал, надеюсь, описательное имя.
http_response_code()
Функция была введена в PHP 5.4, и он сделал вещи намного проще.
http_response_code(404);
Вот и все.
Вот функция, которую я приготовил, когда мне требовалась совместимость ниже 5,4, но мне нужна была функциональность «новой» http_response_code
функции. Я считаю, что PHP 4.3 более чем достаточно для обратной совместимости, но вы никогда не знаете ...
// For 4.3.0 <= PHP <= 5.4.0
if (!function_exists('http_response_code'))
{
function http_response_code($newcode = NULL)
{
static $code = 200;
if($newcode !== NULL)
{
header('X-PHP-Response-Code: '.$newcode, true, $newcode);
if(!headers_sent())
$code = $newcode;
}
return $code;
}
}
header('X-PHP-Response-Code: 404', true, 404);
работает правильно под PHP-FPM (FastCGI)headers_sent()
всегда будет правдой сразу после звонкаheader()
? (2) когда-нибудь найти что-то вроде http_response_text () в мире 5.4? По крайней мере старый header () может влиять на текст после кода состояния.headers_sent()
имеет значение true, если вы не можете добавить больше заголовков, потому что контент уже отправлен, а не если вы добавили заголовок. (2) Извините, нет. Другие языки имеют лучшую поддержкуhttp_response_code
(и, возможно, в целом изменение заголовка) больше не работает после того, как выecho
что-то сделали. Надеюсь, поможет.К сожалению, я обнаружил, что решения, представленные @dualed, имеют различные недостатки.
Использование
substr($sapi_type, 0, 3) == 'cgi'
не достаточно, чтобы обнаружить быстрый CGI. При использовании PHP-FPM FastCGI Process Managerphp_sapi_name()
возвращает fpm, а не cgiFasctcgi и php-fpm раскрывают еще одну ошибку, упомянутую @Josh - использование
header('X-PHP-Response-Code: 404', true, 404);
работает правильно под PHP-FPM (FastCGI)header("HTTP/1.1 404 Not Found");
может произойти сбой, если протокол не HTTP / 1.1 (т. е. «HTTP / 1.0»). Текущий протокол должен быть обнаружен с помощью$_SERVER['SERVER_PROTOCOL']
(доступно с PHP 4.1.0Существует как минимум 2 случая, когда вызов
http_response_code()
приводит к неожиданному поведению:Для справки здесь приведен полный список кодов состояния ответа HTTP (этот список включает коды из интернет-стандартов IETF, а также других RFC IETF. Многие из них в настоящее время НЕ поддерживаются функцией PHP http_response_code): http: //en.wikipedia .org / вики / List_of_HTTP_status_codes
Вы можете легко проверить эту ошибку, позвонив:
Сервер отправит HTTP-код ответа «500 Internal Server Error», что приведет к непредвиденным ошибкам, если у вас есть, например, пользовательское клиентское приложение, вызывающее ваш сервер и ожидающее дополнительные HTTP-коды.
Мое решение (для всех версий PHP начиная с 4.1.0):
Вывод
Реализация http_response_code () не поддерживает все коды ответов HTTP и может перезаписать указанный код ответа HTTP другим кодом из той же группы.
Новая функция http_response_code () не решает все связанные с этим проблемы, а усугубляет ситуацию, создавая новые ошибки.
Решение «совместимости», предлагаемое @dualed, не работает должным образом, по крайней мере, в PHP-FPM.
Другие решения, предлагаемые @dualed, также имеют различные ошибки. Быстрое обнаружение CGI не обрабатывает PHP-FPM. Текущий протокол должен быть обнаружен.
Любые тесты и комментарии приветствуются.
источник
начиная с PHP 5.4 вы можете использовать
http_response_code()
для получения и установки кода статуса заголовка.вот пример:
вот документ этой функции в php.net:
http_response_code
источник
Добавьте эту строку перед любым выводом тела, если вы не используете буферизацию вывода.
Замените часть сообщения («ОК») соответствующим сообщением, а код состояния - соответствующим образом (404, 501 и т. Д.).
источник
Если вы находитесь здесь из-за того, что Wordpress дает 404 при загрузке среды, это должно решить проблему:
Проблема связана с отправкой заголовка Status: 404 Not Found. Вы должны переопределить это. Это также будет работать:
источник
С функцией заголовка . В разделе приведен пример первого параметра, который он принимает.
источник
http_response_code (200); не работает, поскольку тестовое оповещение 404 https://developers.google.com/speed/pagespeed/insights/
источник
Если ваша версия PHP не включает эту функцию:
источник
Мы можем получить другое возвращаемое значение из http_response_code через две разные среды:
В среде веб-сервера верните предыдущий код ответа, если вы указали код ответа или если вы не указали код ответа, тогда будет напечатано текущее значение. Значение по умолчанию - 200 (ОК).
В среде CLI значение true будет возвращено, если вы предоставили код ответа, и значение false, если вы не предоставите код ответа.
Пример среды веб-сервера возвращаемого значения кода ответа:
Пример среды CLI возвращаемого значения Response_code:
источник