Получить заголовок запроса "Content-Type" в PHP - PullRequest
44 голосов
/ 02 апреля 2011

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

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

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

Ответы [ 3 ]

54 голосов
/ 02 апреля 2011

Обычные (GET) запросы не имеют заголовка Content-Type.Для запросов POST это будет выглядеть как $_SERVER["CONTENT_TYPE"] со значением типа multipart / form-data или application / x-www-form-urlencoded.

Это предписано CGI /1.1 спецификация: http://www.ietf.org/rfc/rfc3875.

20 голосов
/ 02 апреля 2011

Вам нужно будет вручную указать 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 будут пустыми.

5 голосов
/ 06 декабря 2012

Вы также можете получить тип содержимого (например, «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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...