Получить заголовок запроса "Content-Type" в PHP
Я внедряю сервис REST на PHP. Эта служба должна поддерживать несколько форматов ввода и вывода (JSON, XML). По этой причине я хочу проверить заголовки запросов "Принять" и "Тип контента" для типа контента, отправленного и запрошенного клиентом.
Доступ к заголовку "Принять" так же прост, как использование $_SERVER['HTTP_ACCEPT']
. Но доступ к заголовку "Content-Type" представляется сложной задачей. Я просмотрел документацию по PHP и веб, но единственным предложенным решением было использование функции PHP apache_request_headers()
, которая поддерживается только при установке PHP в качестве модуля Apache, что в моем случае неверно.
Итак, мой вопрос сейчас: Как я могу получить доступ к заголовку "Тип содержимого" запроса?
3 answers
Обычные запросы (GET) не имеют заголовка Content-Type
. Для запросов на публикацию он будет выглядеть следующим образом $_SERVER["CONTENT_TYPE"]
, со значением, таким как составная часть/форма-данные или приложение/x-www-форма-URL-кодированный.
Это предусмотрено спецификацией 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, как это делают большинство служб rest. Если вы используете другой веб-сервер или в значительной степени неслыханный PHP SAPI, вам понадобится чтобы использовать аналогичный трюк; PHP как CGI просто не имеет доступа к заголовкам запросов за пределами содержимого $_SERVER
, независимо от того, какие другие механизмы вы используете - $_ENV
, apache_request_headers()
, даже классы в расширении php_http
все будут пустыми.
Вы также можете получить тип контента (например, "текст/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.