Я внедряю службу REST в PHP. Эта служба должна поддерживать несколько форматов ввода и вывода (JSON, XML). По этой причине я хочу проверить заголовки запроса «Принять» и «Тип контента» для типа контента, отправленного и запрошенного клиентом.
Доступ к заголовку «Принять» прост с использованием $_SERVER['HTTP_ACCEPT']
. Но доступ к заголовку «Content-Type» представляется сложной задачей. Я искал документацию по PHP и Интернет, но единственным предлагаемым решением было использование функции PHP apache_request_headers()
которая поддерживается только в том случае, если PHP установлен как модуль Apache, что в моем случае неверно.
Итак, теперь мой вопрос: как я могу получить доступ к заголовку «Content-Type» запроса?
Обычные (GET) запросы не имеют заголовка Content-Type
. Для запросов POST он будет выглядеть как $_SERVER["CONTENT_TYPE"]
со значением, например multipart / form-data или application / x-www-form-urlencoded.
Это предусмотрено спецификацией CGI / 1.1: http://www.ietf.org/rfc/rfc3875 .
Вам необходимо вручную указать Apache для поставки заголовка Content-Type
(плюс любые другие заголовки, которые вы хотите).
Поп-что-то подобное в вашем файле .htaccess
или виртуальном хосте:
RewriteEngine on RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L]
И вуаля, вы просто синтезировали свой собственный $_SERVER['HTTP_CONTENT_TYPE']
!
Редактировать:
Я предполагаю, что вы используете PHP как CGI с Apache, поэтому вы можете использовать глаголы, отличные от GET и POST, как это делают большинство служб отдыха. Если вы используете другой веб-сервер или в значительной степени неслыханный PHP SAPI, вам нужно использовать подобный трюк; PHP, поскольку CGI просто не имеет доступа к заголовкам запроса вне содержимого $_SERVER
, независимо от того, какие другие механизмы вы используете – $_ENV
, apache_request_headers()
, даже классы в расширении php_http
будут пусты.
Вы также можете получить тип контента (например, «text / html») с помощью этого:
echo split(',', getallheaders()['Accept'])[0];
или
echo get_headers('http://127.0.0.1', 1)["Content-Type"]
Обновить
Как сказал Бенджамин, apache_request_headers
доступен с FastCGI с 5.4.0 и с внутреннего сервера PHP с 5.5.7.