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


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

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

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

Author: CodeZombie, 2011-04-02

3 answers

Обычные запросы (GET) не имеют заголовка Content-Type. Для запросов на публикацию он будет выглядеть следующим образом $_SERVER["CONTENT_TYPE"], со значением, таким как составная часть/форма-данные или приложение/x-www-форма-URL-кодированный.

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

 51
Author: mario, 2014-08-31 19:29:32

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

 19
Author: Neil E. Pearson, 2011-04-01 23:53:54

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

 5
Author: Fabien Sa, 2014-07-05 10:44:28