在PHP中获取请求的“Content-Type”标头

时间:2011-04-01 23:09:17

标签: php http rest http-headers

我正在用PHP实现REST服务。该服务应该能够支持多种输入和输出格式(JSON,XML)。出于这个原因,我想检查请求标题“接受”“内容类型”,了解客户发送和请求的内容类型。

访问“接受”标头非常简单,只需使用$_SERVER['HTTP_ACCEPT']即可。但访问“Content-Type”标题似乎是一项艰巨的任务。我搜索了PHP文档和Web,但提供的唯一解决方案是使用PHP函数apache_request_headers(),仅当PHP作为Apache模块安装时才支持该函数,在我的情况下不是这样。

现在我的问题是:如何访问请求的标题“Content-Type”?

3 个答案:

答案 0 :(得分:54)

正常(GET)请求没有Content-Type标头。对于POST请求,它将显示为 $_SERVER["CONTENT_TYPE"] ,其值类似于multipart / form-data或application / x-www-form-urlencoded。

这是CGI / 1.1规范要求的:http://www.ietf.org/rfc/rfc3875

答案 1 :(得分:20)

您需要手动指示Apache提供Content-Type标头(以及您想要的任何其他标头)。

.htaccess文件或虚拟主机中弹出类似内容:

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

瞧,你刚刚合成了自己的$_SERVER['HTTP_CONTENT_TYPE']

修改

我假设您使用Apache运行PHP作为CGI,因此您可以使用除GET和POST之外的动词,就像大多数其他服务一样。如果您正在使用其他Web服务器或者基本上闻所未闻的PHP SAPI,您将需要使用类似的技巧; PHP作为CGI根本无法访问$_SERVER内容之外的请求标头,无论您使用哪种其他机制 - $_ENVapache_request_headers(),甚至{{1}中的类扩展名都是空的。

答案 2 :(得分:5)

您还可以使用以下内容获取内容类型(例如“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服务器。