php код ответа сервера

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

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

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

7 ответов

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

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

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

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

однако, это требует специального лечения (Быстро)CGI PHP:

Примечание: по словам HTTP RFC на почему фраза может быть любой пользовательской строкой (которая соответствует стандарту), но ради совместимости с клиентом I не рекомендуем поместить туда случайную строку.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

вывод

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

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

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

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

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

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

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

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

Источник

http_response_code

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

http_response_code — Получает или устанавливает код ответа HTTP

Описание

Получает или задаёт коды ответов HTTP.

Список параметров

Возвращаемые значения

Примеры

Пример #1 Использование http_response_code() в окружении веб-сервера

// Берём текущий код и устанавливаем новый
var_dump ( http_response_code ( 404 ));

// Берём новый код
var_dump ( http_response_code ());
?>

Результат выполнения данного примера:

Пример #2 Использование http_response_code() в CLI

// Берём текущий код по умолчанию
var_dump ( http_response_code ());

// Устанавливаем код
var_dump ( http_response_code ( 201 ));

// Берём новый код
var_dump ( http_response_code ());
?>

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 18 notes

If your version of PHP does not include this function:

For reference the error codes I got from PHP’s source code:

And how the current http header is sent, with the variables it uses:

Note that you can NOT set arbitrary response codes with this function, only those that are known to PHP (or the SAPI PHP is running on).

The following codes currently work as expected (with PHP running as Apache module):
200 – 208, 226
300 – 305, 307, 308
400 – 417, 422 – 424, 426, 428 – 429, 431
500 – 508, 510 – 511

Codes 0, 100, 101, and 102 will be sent as «200 OK».

Everything else will result in «500 Internal Server Error».

If you want to send responses with a freestyle status line, you need to use the `header()` function:

When setting the response code to non-standard ones like 420, Apache outputs 500 Internal Server Error.

This happens when using header(0,0,420) and http_response_code(420).
Use header(‘HTTP/1.1 420 Enhance Your Calm’) instead.

Note that the response code in the string IS interpreted and used in the access log and output via http_response_code().

You can also create a enum by extending the SplEnum class.
/** HTTP status codes */
class HttpStatusCode extends SplEnum <
const __default = self :: OK ;

const SWITCHING_PROTOCOLS = 101 ;
const OK = 200 ;
const CREATED = 201 ;
const ACCEPTED = 202 ;
const NONAUTHORITATIVE_INFORMATION = 203 ;
const NO_CONTENT = 204 ;
const RESET_CONTENT = 205 ;
const PARTIAL_CONTENT = 206 ;
const MULTIPLE_CHOICES = 300 ;
const MOVED_PERMANENTLY = 301 ;
const MOVED_TEMPORARILY = 302 ;
const SEE_OTHER = 303 ;
const NOT_MODIFIED = 304 ;
const USE_PROXY = 305 ;
const BAD_REQUEST = 400 ;
const UNAUTHORIZED = 401 ;
const PAYMENT_REQUIRED = 402 ;
const FORBIDDEN = 403 ;
const NOT_FOUND = 404 ;
const METHOD_NOT_ALLOWED = 405 ;
const NOT_ACCEPTABLE = 406 ;
const PROXY_AUTHENTICATION_REQUIRED = 407 ;
const REQUEST_TIMEOUT = 408 ;
const CONFLICT = 408 ;
const GONE = 410 ;
const LENGTH_REQUIRED = 411 ;
const PRECONDITION_FAILED = 412 ;
const REQUEST_ENTITY_TOO_LARGE = 413 ;
const REQUESTURI_TOO_LARGE = 414 ;
const UNSUPPORTED_MEDIA_TYPE = 415 ;
const REQUESTED_RANGE_NOT_SATISFIABLE = 416 ;
const EXPECTATION_FAILED = 417 ;
const IM_A_TEAPOT = 418 ;
const INTERNAL_SERVER_ERROR = 500 ;
const NOT_IMPLEMENTED = 501 ;
const BAD_GATEWAY = 502 ;
const SERVICE_UNAVAILABLE = 503 ;
const GATEWAY_TIMEOUT = 504 ;
const HTTP_VERSION_NOT_SUPPORTED = 505 ;
>

Status codes as an array:

The note above from «Anonymous» is wrong. I’m running this behind the AWS Elastic Loadbalancer and trying the header(‘:’.$error_code. ) method mentioned above is treated as invalid HTTP.

The documentation for the header() function has the right way to implement this if you’re still on ( «HTTP/1.0 404 Not Found» );
?>

At least on my side with php-fpm and nginx this method does not change the text in the response, only the code.

// HTTP/1.1 404 Not Found
http_response_code ( 404 );

?>

The resulting response is HTTP/1.1 404 OK

http_response_code() does not actually send HTTP headers, it only prepares the header list to be sent later on.
So you can call http_reponse_code() to set, get and reset the HTTP response code before it gets sent.

http_response_code(500); // set the code
var_dump(headers_sent()); // check if headers are sent
http_response_code(200); // avoid a default browser page

http_response_code is basically a shorthand way of writing a http status header, with the added bonus that PHP will work out a suitable Reason Phrase to provide by matching your response code to one of the values in an enumeration it maintains within php-src/main/http_status_codes.h. Note that this means your response code must match a response code that PHP knows about. You can’t create your own response codes using this method, however you can using the header method.

1. Using http_response_code will cause PHP to match and apply a Reason Phrase from a list of Reason Phrases that are hard-coded into the PHP source code.

2. Because of point 1 above, if you use http_response_code you must set a code that PHP knows about. You can’t set your own custom code, however you can set a custom code (and Reason Phrase) if you use the header method.

It’s not mentioned explicitly, but the return value when SETTING, is the OLD status code.
e.g.
= http_response_code ();
$b = http_response_code ( 202 );
$c = http_response_code ();

if you need a response code not supported by http_response_code(), such as WebDAV / RFC4918’s «HTTP 507 Insufficient Storage», try:

HTTP/1.1 507 Insufficient Storage

On PHP 5.3 version, If you want to set HTTP response code. You can try this type of below trick 🙂

Источник

Php код ответа сервера

Знание кодов возврата HTTP (ответов) весьма важно для системного администратора.

Вы, наверняка уже знаете, что протокол HTTP возвращает определенные коды ответов HTTP, которые являются кодами статуса HTTP-соединения.

Код ответа HTTP 200 является кодом нормального завершения операции, вы его не видите, когда получаете страницу.

Всего определено 5 категорий кодов ответа HTTP. Каждая из этих категорий может содержать 100 кодов возврата.

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

Диапазон 200. 299 является диапазоном успешных операций. Коды, относящиеся к этому диапазону, сообщают об удачном завершении той или иной операции. К этому диапазону относятся также коды, сообщающие, что запрашиваемый файл пуст (no content), и сообщающие, что запрос был принят.

Диапазон кодов ответа 300. 399 являются кодами перенаправления (redirect).

Коды диапазона 400. 499 являются ошибками клиента. Например, пользователь может запросить несуществующий документ. К этому же диапазону относятся и ошибки «Forbidden» и «Unauthorized». И первая, и вторая сообщают, что у клиента нет доступа к определенному ресурсу. В первом случае доступ просто запрещен, а во втором случае клиент не является авторизированным.

Коды ответа 500. 599 являются кодами ошибок сервера. Данные ошибки возникают при внутренней ошибке сервера или же при неправильном его конфигурировании. Во втором случае сервер просто не может правильно возвратить ответ на запрос. Этот тип ошибок встречается обычно, когда ошибку совершает сценарий (скрипт), расположенный на сервере.

Некоторые интерпретаторы скриптов, например, PHP никогда не допускают такой ошибки. Если в PHP-скрипте присуствуют ошибки, то интерпретатор PHP просто возвратит клиенту сообщение об этой ошибке. Со стороны сервера это будет выглядеть как нормальный ответ клиенту (браузеру). Например, в отличие от PHP-интерпретатора, Perl возвращает сообщение об ошибке в протокол HTTP.

Теперь приведем список основных кодов возврата HTTP:

Таблица кодов возврата HTTP

Источник

PHP: How to send HTTP response code?

I have a PHP script that needs to make responses with HTTP response codes (status-codes), like HTTP 200 OK, or some 4XX or 5XX code.

How can I do this in PHP?

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

8 Answers 8

I just found this question and thought it needs a more comprehensive answer:

As of PHP 5.4 there are three methods to accomplish this:

Assembling the response code on your own (PHP >= 4.0)

The header() function has a special use-case that detects a HTTP response line and lets you replace that with a custom one

However, this requires special treatment for (Fast)CGI PHP:

Note: According to the HTTP RFC, the reason phrase can be any custom string (that conforms to the standard), but for the sake of client compatibility I do not recommend putting a random string there.

Note: php_sapi_name() requires PHP 4.0.1

3rd argument to header function (PHP >= 4.3)

There are obviously a few problems when using that first variant. The biggest of which I think is that it is partly parsed by PHP or the web server and poorly documented.

Since 4.3, the header function has a 3rd argument that lets you set the response code somewhat comfortably, but using it requires the first argument to be a non-empty string. Here are two options:

I recommend the 2nd one. The first does work on all browsers I have tested, but some minor browsers or web crawlers may have a problem with a header line that only contains a colon. The header field name in the 2nd. variant is of course not standardized in any way and could be modified, I just chose a hopefully descriptive name.

http_response_code function (PHP >= 5.4)

The http_response_code() function was introduced in PHP 5.4, and it made things a lot easier.

Compatibility

Here is a function that I have cooked up when I needed compatibility below 5.4 but wanted the functionality of the «new» http_response_code function. I believe PHP 4.3 is more than enough backwards compatibility, but you never know.

Unfortunately I found solutions presented by @dualed have various flaws.

Using substr($sapi_type, 0, 3) == ‘cgi’ is not enogh to detect fast CGI. When using PHP-FPM FastCGI Process Manager, php_sapi_name() returns fpm not cgi

There are at least 2 cases when calling http_response_code() result in unexpected behaviour:

For your reference here there is the full list of HTTP response status codes (this list includes codes from IETF internet standards as well as other IETF RFCs. Many of them are NOT currently supported by PHP http_response_code function): http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

You can easily test this bug by calling:

The server will send «500 Internal Server Error» HTTP response code resulting in unexpected errors if you have for example a custom client application calling your server and expecting some additional HTTP codes.

My solution (for all PHP versions since 4.1.0):

Conclusion

http_response_code() implementation does not support all HTTP response codes and may overwrite the specified HTTP response code with another one from the same group.

The new http_response_code() function does not solve all the problems involved but make things worst introducing new bugs.

The «compatibility» solution offered by @dualed does not work as expected, at least under PHP-FPM.

The other solutions offered by @dualed also have various bugs. Fast CGI detection does not handle PHP-FPM. Current protocol must be detected.

Источник

Проверка кода ответа сервера и http заголовков

Когда мы открываем любую веб-страницу нужного нам сайта вместе с HTML кодом страницы сервер передает код статуса запроса и http заголовки. По коду статуса программы могут быстро определить все ли прошло успешно или, например, такой страницы нет на сервере. Заголовки содержат информацию для браузера, которая указывает как нужно обрабатывать страницу и что с ней делать.

Обычным пользователям эта информация ни к чему, но если вы администратор сайта или технический специалист, она может быть для вас очень полезной. В этой статье мы рассмотрим как выполняется проверка кода ответа сервера и http заголовков с помощью утилиты curl.

Что такое код ответа сервера?

Для нормальной работы различных программ, работающих по протоколу HTTP сервер возвращает не только текст страницы, но и трехзначный код, который позволяет определить результат запроса. С помощью этого кода можно не только описать какая ошибка возникла во время обработки, но и перенаправить пользователя на другую страницу, или же сказать, что страница не была изменена. Вот самые распространенные коды ответа сервера:

Что такое http заголовки?

С помощью http заголовков клиент и сервер обмениваются информацией и командами между собой. Они используются для согласования метода, протокола, кодировки, языка и многих других параметров работы. Рассмотрим основные заголовки, которые будет отправлять сервер:

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

Проверка кода ответа сервера с помощью cURL

Чтобы увидеть только код ответа страницы достаточно выполнить такую команду:

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

Или, если хотите, чтобы ответ выглядел более естественно:

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

Страницы вернули 200, все в порядке. Но отправляет ли сервер редирект для нужных нам страниц? Если ваш сайт работает на https, то все запросы http должны перекидываться на https, также для любого сайта, все запросы на www домен должны перенаправляться на основной, или наоборот. Запросы на ip сайта тоже в идеале должны отправляться на основной домен. Проверка http ответа:

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

Все работает так, как нужно. Но смотреть код ответа сервера вряд ли понадобиться, намного интереснее проверка http статусов.

Проверка http заголовков с помощью Curl

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

Здесь отображается код ответа сервера, а также принятые http заголовки. Из них мы можем сделать такие выводы:

Таким способом может быть выполнена проверка http заголовков для любой страницы или ресурса чтобы сразу определить все ли отправляется правильно. Например, посмотрим заголовки для изображения:

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

Мы можем видеть, что картинка будет храниться в кэше намного дольше (max-age) чем html страница.

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

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

Проверка If-Modified-Since

Сначала запрашиваем нашу страницу для просмотра заголовков http, а затем копируем поле Last-Modified:

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

Теперь запрашиваем ее еще раз, но уже с заголовком If-Modified-Since: и ваша дата:

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

В ответ вы должны получить не саму страницу, а только заголовок HTTP/1.1 304 Not Modified. Если так, значит проверка кода ответа сервера пройдена и все работает верно.

Проверка If-None-Match

Заголовок If-None-Match работает похожим образом, только здесь используется значение контрольной суммы кэша из поля ETag. Опять запросим нашу страницу и скопируем сумму:

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

Затем отправим полученную сумму с заголовком:

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

И снова мы должны получить ответ 304, страница не изменена.

Проверка сжатия

Сжатие позволяет уменьшить размер передаваемых данных, но в то же время создает дополнительную нагрузку на сервер. Чтобы проверить поддерживает ли сервер сжатие gzip нужно отправить в запросе заголовок Accept-Encoding с параметром gzip:

php код ответа сервера. Смотреть фото php код ответа сервера. Смотреть картинку php код ответа сервера. Картинка про php код ответа сервера. Фото php код ответа сервера

В ответе мы увидим поле Content-Encoding: gzip. Это будет означать, что сжатие используется.

Выводы

В этой статье мы рассмотрели как выполняется проверка ответа сервера и проверка http заголовков, это может быть очень полезно для аудита технической стороны вашего сайта, а также для решения определенных проблем. Надеюсь, изложенная в статье информация была вам полезной.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *