在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服务器上获得。