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

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: как отправить код ответа 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().

Status codes as an array:

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 ;
>

Do not mix the use of http_response_code() and manually setting the response code header because the actual HTTP status code being returned by the web server may not end up as expected. http_response_code() does not work if the response code has previously been set using the header() function. Example:

( ‘HTTP/1.1 401 Unauthorized’ );
http_response_code ( 403 );
print( http_response_code ());
?>

The raw HTTP response will be (notice the actual status code on the first line does not match the printed http_response_code in the body):

HTTP/1.1 401 Unauthorized
Date: Tue, 24 Nov 2020 13:49:08 GMT
Server: Apache
Connection: Upgrade, Keep-Alive
Keep-Alive: timeout=5, max=100
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

I only tested it on Apache. I am not sure if this behavior is specific to Apache or common to all PHP distributions.

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 ();

Источник

Как получить HTTP код ответа удаленного веб-сервера из PHP?

php код ответа сервера. ale eto server. php код ответа сервера фото. php код ответа сервера-ale eto server. картинка php код ответа сервера. картинка ale eto server. Знание кодов возврата HTTP (ответов) весьма важно для системного администратора.

Когда требуется получить HTTP код для заданной URL, то вы наверняка воспользуетесь PHP функцией get_headers($url). Дальше я расскажу о разных подводных камнях и возникающих попутных проблемах.

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

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

Домен не существует

Да такое бывает, когда введенный адрес не существует. Вернее не адрес, а доменное имя сайта. Запрос посылать некуда, а вы увидите (если не отключили вывод php warnings) что то вроде следующего:

php код ответа сервера. domain name is not found. php код ответа сервера фото. php код ответа сервера-domain name is not found. картинка php код ответа сервера. картинка domain name is not found. Знание кодов возврата HTTP (ответов) весьма важно для системного администратора.

PHP вернет пустые заголовки, из которых ничего не извлечь. Как можно обработать эту ситуацию?

Тут вы уже не увидите сообщений от PHP, а в случае невозможности определить адрес сервера — будет установлено какое то кастомное значение вместо HTTP кода, чтобы иметь возможность его обработать дальше.

Доменные имена с использованием национальных наборов символов.

Функция get_headers не настолько умна, чтобы переводить ваш http://россия.рф в http://xn--h1alffa9f.xn--p1ai200.

Если вы попытаетесь запросить заголовки без перевода в нужный вид, то прошлый пример выдаст вам загадочное ‘no response’. В то время как браузер без проблем откроет сайт, т.к. умеет переводить доменные имена, в которых используются местные национальные наборы символов, отличные от латиницы.

Для конвертации используем свободно распространяемую библиотеку idna_convert. Качайте архив, распаковывайте и подключайте в ваш код.

Источник

Протокол HTTP и работа с заголовками

Протокол HTTP

Как работает WWW (всемирная паутина, веб) в двух словах:

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

Как работает HTTP, и зачем нам это знать

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

Протокол HTTP очень прост и состоит, по сути, из двух частей:

Сначала идёт список заголовков, затем пустая строка, а затем (если есть) тело запроса/ответа.

И клиент, и сервер могут посылать друг другу заголовки и тело ответа, но в случае с клиентом доступные заголовки будут одни, а с сервером — другие. Рассмотрим пошагово, как будет выглядеть работа по протоколу HTTP в случае, когда пользователь хочет загрузить главную страницу социальной сети «Вконтакте».

1. Браузер пользователя устанавливает соединение с сервером vk.com и отправляет следующий запрос:

2. Сервер принимает запрос и отправляет ответ:

3. Браузер принимает ответ и показывает готовую страницу

Больше всего нам интересен самый первый шаг, где браузер инициирует запрос к серверу vk.com
Рассмотрим подробнее, что там происходит. Первая строка запроса определяет несколько важных параметров, а именно:

GET — это метод (глагол), который мы применяем для доступа к указанной странице.
GET является самым часто используемым методом, потому что он говорит серверу о том, что клиент всего лишь хочет прочитать указанный документ. Но помимо GET есть и другие методы, один из них мы рассмотрим уже в следующем разделе.

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

Спецификация HTTP 1.1 определяет 40 различных кодов HTTP.

После стартовой строки следуют заголовки, а затем тело ответа.

Работа с заголовками в PHP

В PHP есть все возможности для взаимодействия с протоколом HTTP:

Разберём всё по порядку.

Получение тела запроса

Получение заголовков запроса

Пример, как получить предыдущую страницу, с которой перешёл пользователь:

Добавление/изменение заголовков ответа

В PHP-сценарии можно управлять всеми заголовками ответа, которые попадут к пользователю вместе с контентом страницы. Это возможно, потому что PHP работает на стороне веб-сервера и имеет с ним очень тесную интеграцию.
Вот примеры сценариев, когда пригодится управление заголовками ответа:

Управление телом ответа

Параметры запроса

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

Из чего состоит URI

URI — это уникальный идентификатор ресурса. Ресурс в нашем случае — это полный путь до страницы сайта. И вот как может выглядеть ресурс для показа погоды за конкретный день:
http://weather-diary.ru/day.php?date=2017-10-15

В примере выше указывается два аргумента: дата и единица измерения температуры.

Параметры запроса как внешние переменные

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

Получение параметров запроса

Формирование URI с параметрами запроса

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

Здесь мы использовали две функции:

Источник

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

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