PHP: как отправить код ответа HTTP?

У меня есть php-скрипт, который должен делать ответы с кодами ответов HTTP (коды состояния), например HTTP 200 OK, или какой-то код 4XX или 5XX.

Как я могу это сделать в PHP?

7 ответов


Я только что нашел этот вопрос и подумал, что ему нужен более полный ответ:

по состоянию на PHP 5.4 есть три способа достижения этого:

сборка кода ответа самостоятельно (PHP >= 4.0)

на header() функция имеет специальный прецедент, который обнаруживает строку ответа HTTP и позволяет заменить ее пользовательской

header("HTTP/1.1 200 OK");

однако, это требует специального лечения (Быстро)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 на почему фраза может быть любой пользовательской строкой (которая соответствует стандарту), но ради совместимости с клиентом I не рекомендуем поместить туда случайную строку.

Примечание: php_sapi_name() требует PHP 4.0.1

3-й аргумент функции заголовка (PHP >= 4.3)

очевидно, есть несколько проблем при использовании этого первого варианта. Самый большой из которых я думаю, что он частично проанализирован PHP или веб-сервером и плохо документирован.

начиная с 4.3, то header функция имеет 3-й аргумент, который позволяет вам установить код ответа несколько удобно, но использование его требует, чтобы первый аргумент был непустой строкой. Вот два варианта:

header(':', true, 404);
header('X-PHP-Response-Code: 404', true, 404);

я рекомендую 2-й. Первый тут работа во всех браузерах, которые я тестировал, но некоторые второстепенные браузеры или веб-искатели могут иметь проблемы со строкой заголовка, которая содержит только двоеточие. Имя поля заголовка во 2-ом. вариант, конечно, никоим образом не стандартизирован и может быть изменен, я просто выбрал, надеюсь, описательное имя.

функция http_response_code (PHP >= 5.4)

на http_response_code() функция была введена в PHP 5.4, и это сделало вещи a лот!--14--> легче.

http_response_code(404);

вот и все.

совместимость

вот функция, которую я приготовил, когда мне нужна совместимость ниже 5.4, но хотел функциональность "нового"


к сожалению, я нашел решения, представленные @dualed имеют различные недостатки.

  1. используя substr($sapi_type, 0, 3) == 'cgi' не enogh для обнаружения быстрого CGI. При использовании PHP-FPM FastCGI Process Manager,php_sapi_name() возвращает fpm не cgi

  2. Fasctcgi и php-fpm разоблачают еще одну ошибку, упомянутую @Josh-using header('X-PHP-Response-Code: 404', true, 404); работает правильно под PHP-FPM (FastCGI)

  3. header("HTTP/1.1 404 Not Found"); может произойти сбой, если протокол не HTTP / 1.1 (т. е. "HTTP/1.0"). Текущий протокол должен быть обнаружен с помощью $_SERVER['SERVER_PROTOCOL'] (доступно с PHP 4.1.0

  4. есть по крайней мере 2 случая, когда вызов http_response_code() результат неожиданного поведения:

    • когда PHP сталкивается с кодом ответа HTTP, он не понимает, PHP заменит код на тот, который он знает из той же группы. Например, "521 веб-сервер не работает "заменяется на"500 Внутренняя ошибка сервера". Многие другие необычные коды ответов из других групп 2xx, 3xx, 4xx обращаются таким образом.
    • на сервере с php-fpm и nginx http_response_code() функция может изменить код, как ожидалось, но не сообщение. Это может привести к странному заголовку "404 OK", например. Эта проблема также упоминается на веб-сайте PHP комментарием пользователяhttp://www.php.net/manual/en/function.http-response-code.php#112423

для вашей справки здесь полный список кодов состояния ответа HTTP (это список включает коды из интернет-стандартов IETF, а также других Рчк IETF. Многие из них в настоящее время не поддерживаются функцией PHP http_response_code):http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

вы можете легко проверить эту ошибку, позвонив:

http_response_code(521);

сервер отправит код ответа HTTP" 500 внутренних ошибок сервера", что приведет к непредвиденным ошибкам, если у вас есть, например, пользовательское клиентское приложение, вызывающее ваш сервер и ожидающее некоторые дополнительные коды HTTP.


мое решение (для всех версий PHP, начиная с 4.1.0):

$httpStatusCode = 521;
$httpStatusMsg  = 'Web server is down';
$phpSapiName    = substr(php_sapi_name(), 0, 3);
if ($phpSapiName == 'cgi' || $phpSapiName == 'fpm') {
    header('Status: '.$httpStatusCode.' '.$httpStatusMsg);
} else {
    $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
    header($protocol.' '.$httpStatusCode.' '.$httpStatusMsg);
}

вывод

реализация http_response_code () не поддерживает все коды ответа HTTP и может перезаписать указанный код ответа HTTP с другим из той же группы.

новая функция http_response_code() не решает все проблемы, но делает вещи хуже представляем новые ошибки.

решение "совместимость", предлагаемое @dualed, работает не так, как ожидалось, по крайней мере, в PHP-FPM.

другие решения, предлагаемые @dualed также имеют различные ошибки. Быстрое обнаружение CGI не обрабатывает PHP-FPM. Настоящий протокол должен быть обнаружен.

любые тесты и комментарии.

добавьте следующую строку перед любым выходом из тела, в случае, если вы не используете буферизацию вывода.

header("HTTP/1.1 200 OK");

замените часть сообщения ('OK') соответствующим сообщением, а код состояния-соответствующим кодом (404, 501 и т. д.)


начиная с PHP 5.4 вы можете использовать http_response_code() для get и set код состояния заголовка.

вот пример:

<?php

// Get the current response code and set a new one
var_dump(http_response_code(404));

// Get the new response code
var_dump(http_response_code());
?>

вот документ этой функции в php.net:

http_response_code



Если вы здесь из-за Wordpress, дающего 404 при загрузке среды, это должно устранить проблему:

define('WP_USE_THEMES', false);
require('../wp-blog-header.php');
status_header( 200 );
//$wp_query->is_404=false; // if necessary

проблема связана с отправкой статуса: 404 не найден заголовок. Вы должны отменить это. Это также будет работать:

define('WP_USE_THEMES', false);
require('../wp-blog-header.php');
header("HTTP/1.1 200 OK");
header("Status: 200 All rosy");

header("HTTP/1.1 200 OK");
http_response_code(201);

http_response_code(200); не работает, потому что тест предупреждение 404 https://developers.google.com/speed/pagespeed/insights/