在PHP中获取请求的“Content-Type”头
我正在PHP中实现一个REST服务。 这个服务应该能够支持多种input和输出格式(JSON,XML)。 出于这个原因,我想检查客户端发送和请求的内容types的请求头“Accept”和“Content-Type” 。
使用$_SERVER['HTTP_ACCEPT']来访问“Accept”头文件非常简单。 但是访问“Content-Type”标题似乎是一项艰巨的任务。 我search了PHP文档和网页,但是唯一提供的解决scheme是使用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文件或虚拟主机中popup如下所示的内容: 
 RewriteEngine on RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L] 
 瞧,你刚合成你自己的$_SERVER['HTTP_CONTENT_TYPE'] ! 
编辑:
 我假设你使用Apache作为CGI运行PHP,所以你可以使用GET和POST以外的动词,因为大多数rest服务都是这样。 如果您使用的是另一台Web服务器或大部分前所未闻的PHP SAPI,则需要使用类似的技巧;  PHP作为CGI根本无法访问$_SERVER内容以外的请求头,无论使用什么其他机制 – $_ENV , apache_request_headers() ,甚至php_http扩展中的类都将为空。 
您也可以通过以下方式获取内容types(如“text / html”):
 echo split(',', getallheaders()['Accept'])[0]; 
要么
 echo get_headers('http://127.0.0.1', 1)["Content-Type"] 
更新
 就像Benjamin所说的, apache_request_headers可以从5.4.0的FastCGI和5.5.7以上的内部的PHP服务器上获得。