Php header код ответа

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

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

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

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

Начиная с PHP 5.4 для этого есть три метода:

Сборка кода ответа (PHP> = 4.0)

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

Однако для этого требуется специальное лечение (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

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

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

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

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

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

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

Функция http_response_code() была введена в PHP 5.4, и это упростило ситуацию.

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

Вот функция, которую я приготовил, когда мне нужна была совместимость ниже 5.4, но мне нужна функциональность «новой» функции http_response_code . Я считаю, что PHP 4.3 более чем достаточно обратной совместимости, но вы никогда не знаете …

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

  1. Использование substr($sapi_type, 0, 3) == ‘cgi’ не позволяет обнаруживать быстрый CGI. При использовании PHP-FPM FastCGI Process Manager php_sapi_name() возвращает fpm, а не cgi
  2. Fasctcgi и php-fpm раскрывают еще одну ошибку, упомянутую @Josh – с использованием 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 Internal Server Error». Многие другие необычные коды ответов от других групп 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, а также другие 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):

$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. Текущий протокол должен быть обнаружен.

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

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

Замените часть сообщения («ОК») соответствующим сообщением и кодом состояния с кодом (404, 501 и т. Д.),

С функцией заголовка . В разделе приведен первый пример, который он принимает.

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

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

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

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

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

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

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

Источник

Функция header

HTTP заголовки это специальная информация, которая присоединяется к документу, то есть, к тому файлу, который запрашивается браузером с сервера. Когда мы вбиваем в адресную строку какой-нибудь адрес то, соответственно, запрашиваем на сервере по этому адресу какой-нибудь документ. Эта информация(документ) видна у нас на экране. Но кроме видимой части есть еще и невидимая — те самые HTTP заголовки, которые отправляются сервером браузеру и они нужны для того, чтобы браузер корректно отобразил страницу. То есть, заголовки подсказывают браузеру как показать страницу или как отдать страницу.

Для браузера firefox: кнопка F12 -> сеть -> кликнуть «статус» и обновить страницу :

header1

Среди прочего в заголовках отправляется информация о кодировке страницы, как давно модифицировалась страница, информация о том, что это за страница (html-страница, обычный текстовый документ; или, вместо того чтобы показать страницу, отдать ее на скачивание)

Установление кодировки

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

В файле index.php в папке с нашим уроком запишем: привет, мир! и посмотрим в браузере, что получили. Мы можем получить крабозябры . Это происходит по тому, что браузер будет открывать документ в той кодировке, которую сервер отправил в заголовках по умолчанию. Если кодировка нашего документа не совпадает с кодировкой сервера — получим крабозябры.

Кодировка для всех частей нашего приложения должна быть единой .

Рекомендуется всегда использовать кодировку utf-8 — как универсальную кодировку.

Использование метатэга — не всегда помогает, потому что сервер может отправлять по умолчанию свою кодировку в заголовках и в этом случае она будет иметь больший приоритет, чем метатэг charset .

В этом случае мы должны переопределить кодировку сервера с помощью функции header . (php.net)

Функция header позволяет указать нужную нам кодировку.

header ( ‘Content-Type: text/html; charset=utf-8’ );
?>

где:
text/html — тип документа;
charset=utf-8 — нужная нам кодировка.

Если посмотрим заголовки в «разработка/инструменты разработчика/сеть» (в firefox ), то увидим, что они дополнились кодировкой charset=»UTF-8″ , то есть, мы указали браузеру (отправили заголовки), что нужно использовать именно данную кодировку. При этом она имеет приоритет над метатэгом charset .

header2

Еще один способ установления кодировки по умолчанию — это использовать специальный файл .htaccess . Данный файл является файлом настройки сервера Apache .

Создадим даннный файл в нашей папке.

Установим кодировку для сервера по умолчанию с помощью специальной директивы AddDefaultCharset .

Данная директива заставляет сервер отправлять в заголовках кодировку, указанную в качестве значения данной дериктивы.

Организация редиректа

Функцию header часто используют для редиректа .

Создадим новый файл — inc.php и выведем в нем строку: «привет из подключаемого файла» .

echo ‘Привет из подключаемого файла’ ;
?>

В индексном файле используем функцию header для редиректа. Его можно сделать двумя командами:
— командой ‘ Location ‘
— командой ‘ refresh ‘

header ( ‘Content-Type: text/html; charset=utf-8’ );
header ( ‘Location: inc.php’ ); // где inc.php — относительный путь к файлу
?>

При работе с редиректом нужно помнить что редирект происходит не сразу. Когда отрабатывает
данная команда ( header(‘Location: inc.php’); ), выполнение файла продолжается дальше.
Чтобы сделать безусловный редирект и не выполнять дальнейший код нужно воспользоватся
одной из двух команд — функция die (пер.- умри) и функция exit (пер.- выйти).
Эти команды почти всегда рекомендуется использовать после редиректа.

Чтобы убедиться, что у нас код после команды редиректа выполняется, используем редирект
с задержкой: header(‘refresh: 5, url’) , где
5 — время задержки в секундах,
url=inc.php — адрес, на который должен быть перенаправлен пользователь (если внешний адрес,
то используем — http, если внутренний, то используем — относительный путь к файлу ).
Запускаем файл index.php:

header ( ‘Content-Type: text/html; charset=utf-8’ );

header( ‘Location: inc.php’ );
// — где inc.php — относительный путь к файлу

header ( ‘refresh: 5, url=inc.php’ );
// — адрес, на который должен быть перенаправлен пользователь

— после загрузки документа весь код у нас выполнился — выводится: привет мир!
После пятисекундной задержки нас перенаправляет на другой файл ( inc.php ) — выводится: привет из подключаемого файла .
Чтобы код не выполнялся используем любую из функций: либо exit , либо die .

header ( ‘Content-Type: text/html; charset=utf-8’ );
header( ‘Location: inc.php’ );
// — где inc.php — относительный путь к файлу

header ( ‘refresh: 5, url=inc.php’ );
exit ;
// die;
?>

— после загрузки документа код у нас не выполняется — видим пустую страницу.
После пятисекундной задержки перенаправляемся на другой файл — выводится: привет из подключаемого файла .

Проблемы вывода

Функция header отправляет заголовки в браузер. Они помогают коректно отобразить страницу. Эти заголовки должны бать отправленны раньше перед самим контентом страницы, поскольку браузер должен проанализировать заголовки и, в соответствии с ними, показать нашу страницу. Поэтому заголовки должны быть всегда отправленны до вывода , при этом заголовки могут отправлятся только один раз .
Если мы инициализируем вывод в браузер, то заголовки автоматически будут отправленны. Это значит, что если перед функцией header есть какой-то вывод в браузер, то она просто не отработает.

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

— не удается изменить информацию заголовка — заголовки уже отправленны .

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

2. С проблемой вывода можно столкнуться при подключении какого нибудь файла.

Например, мы подключаем файл inc.php, и в нем есть какая-то переменная — $test = ‘TEST’ .

В индексном файле мы хотим использовать данную переменную: $test ?> .

Источник

Читайте также:  Проверить свойство объекта php
Оцените статью