在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内容以外的请求头,无论使用什么其他机制 – $_ENVapache_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服务器上获得。