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