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

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

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

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

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

    Это предусмотрено спецификацией 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, как это делают большинство служб отдыха. Если вы используете другой веб-сервер или в значительной степени неслыханный PHP SAPI, вам нужно использовать подобный трюк; PHP, поскольку CGI просто не имеет доступа к заголовкам запроса вне содержимого $_SERVER , независимо от того, какие другие механизмы вы используете – $_ENV , apache_request_headers() , даже классы в расширении php_http будут пусты.

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