Get "Content-Type" header of request in PHP
Solution 1:
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:
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:
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.