Подтвердить что ты не робот

Получить заголовок запроса Content-Type в PHP

Я внедряю службу REST в PHP. Эта служба должна поддерживать несколько форматов ввода и вывода (JSON, XML). По этой причине я хочу проверить заголовки запроса "Принять" и "Тип контента" для типа контента, отправленного и запрошенного клиентом.

Доступ к заголовку "Принять" прост, используя $_SERVER['HTTP_ACCEPT']. Но доступ к заголовку "Content-Type" представляется сложной задачей. Я искал документацию по PHP и Интернет, но единственным предлагаемым решением было использование функции PHP apache_request_headers(), которая поддерживается только в том случае, если PHP установлен как модуль Apache, что в моем случае неверно.

Итак, теперь мой вопрос: как я могу получить доступ к заголовку "Content-Type" запроса?

4b9b3361

Ответ 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.