Get "Content-Type" header of request in PHP

PhpHttpRestHttp Headers

Php Problem Overview


I'm implementing a REST service in PHP. This service should be able to support multiple input and output formats (JSON, XML). For that reason I want to check the request headers "Accept" and "Content-Type" for the type of content sent and requested by the client.

Accessing the "Accept" header is a simple as using $_SERVER['HTTP_ACCEPT']. But accessing the "Content-Type" header seems to be a difficult task. I searched the PHP documentation and the web, but the only solution offered was the use of the PHP function apache_request_headers() which is only supported when PHP is installed as an Apache module, which is not true in my case.

So my question now: How can I access the header "Content-Type" of a request?

Php Solutions


Solution 1 - Php

Normal (GET) requests do not have a Content-Type header. For POST requests it would appear as $_SERVER["CONTENT_TYPE"], with a value like multipart/form-data or application/x-www-form-urlencoded.

This is mandated by the CGI/1.1 specification: http://www.ietf.org/rfc/rfc3875.

Solution 2 - Php

You'll need to manually instruct Apache to supply the Content-Type header (plus any other headers you want).

Pop something like this in your .htaccess file or virtual host:

RewriteEngine on
RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L]

And voila, you just synthesised your very own $_SERVER['HTTP_CONTENT_TYPE']!

Edit:

I assume you're running PHP as CGI with Apache so you can use verbs other than GET and POST, as most rest services do. If you're using another web server or largely unheard-of PHP SAPI, you'll need to use a similar trick; PHP as CGI simply doesn't have access to request headers outside the contents of $_SERVER, no matter what other mechanisms you use - $_ENV, apache_request_headers(), even the classes in the php_http extension will all be empty.

Solution 3 - Php

You can also get the content type (like "text/html") with this :

echo split(',', getallheaders()['Accept'])[0];

or

echo get_headers('http://127.0.0.1', 1)["Content-Type"]

Update

Like Benjamin said, apache_request_headers is available with FastCGI from 5.4.0 and from internal PHP server since 5.5.7.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCodeZombieView Question on Stackoverflow
Solution 1 - PhpmarioView Answer on Stackoverflow
Solution 2 - PhpNeil E. PearsonView Answer on Stackoverflow
Solution 3 - PhpFabien SaView Answer on Stackoverflow