获得;“内容类型”;PHP中的请求头
我正在用PHP实现一个REST服务。该服务应该能够支持多种输入和输出格式(JSON、XML)。出于这个原因,我想检查请求头“Accept”和“contenttype”中客户端发送和请求的内容类型 使用获得;“内容类型”;PHP中的请求头,php,http,rest,http-headers,Php,Http,Rest,Http Headers,我正在用PHP实现一个REST服务。该服务应该能够支持多种输入和输出格式(JSON、XML)。出于这个原因,我想检查请求头“Accept”和“contenttype”中客户端发送和请求的内容类型 使用$\u服务器['HTTP\u Accept']访问“Accept”头非常简单。但是访问“内容类型”标题似乎是一项困难的任务。我搜索了PHP文档和web,但提供的唯一解决方案是使用PHP函数apache\u request\u headers(),该函数仅在PHP作为apache模块安装时才受支持,在
$\u服务器['HTTP\u Accept']
访问“Accept”头非常简单。但是访问“内容类型”标题似乎是一项困难的任务。我搜索了PHP文档和web,但提供的唯一解决方案是使用PHP函数apache\u request\u headers()
,该函数仅在PHP作为apache模块安装时才受支持,在我的例子中并非如此
所以我现在的问题是:如何访问请求的标题“内容类型”?正常(GET)请求没有内容类型
标题。对于POST请求,它将显示为$\u SERVER[“CONTENT\u TYPE”]
,其值类似于multipart/form data或application/x-www-form-urlencoded
这是CGI/1.1规范规定的:。您需要手动指示Apache提供
内容类型
标题(以及您想要的任何其他标题)
在.htaccess
文件或虚拟主机中弹出类似的内容:
RewriteEngine on
RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L]
瞧,你刚刚合成了你自己的$\u服务器['HTTP\u CONTENT\u TYPE']
编辑:
我假设您正在将PHP作为CGI与Apache一起运行,这样您就可以像大多数rest服务一样使用GET和POST以外的动词。如果您使用的是另一个web服务器或是闻所未闻的PHP SAPI,则需要使用类似的技巧;作为CGI的PHP根本无法访问
$\u服务器
内容之外的请求头,无论您使用什么其他机制-$\u ENV
,apache\u请求头()
,甚至PHP\u http
扩展中的类都将是空的。您还可以获取内容类型(如“text/html”)为此:
echo split(',', getallheaders()['Accept'])[0];
或
更新
正如Benjamin所说,5.4.0版本的FastCGI和5.5.7版本的内部PHP服务器都提供了
apache\u请求\u头文件。
。谢谢,成功了!我印象深刻:-)PHP/Apache平台上REST服务的老问题。我特别强调将vhost与应用程序一起分发,因为它们通常非常庞大。很高兴它成功了:)@NeilE.Pearson有没有办法在标题中允许charset
?我接受它。这不需要mod_rewriteSetEnvIfNoCase^Content Type“(.+)”Content_Type=$1
这应该是选择的答案!谢谢你的信息。从文档中可以看出:“这些函数仅在作为Apache模块运行PHP时可用。”。据我所知,PHP经常使用FastCGI运行。这正是我的场景中的情况。我个人更喜欢$\u服务器[“CONTENT\u TYPE”]
,它看起来更干净。请注意apache\u request\u headers()
在PHP5.4.0的FastCGI下可用。请记住$\u服务器[“CONTENT\u TYPE”]
并不总是可用的。内置PHP服务器有一个有文档记录的错误报告。它应该返回CONTENT\u TYPE
,而不是返回HTTP\u CONTENT\u TYPE
。希望它能在不久的将来修复。尽管不常见,GET请求可以有一个内容类型头,也可以包含一个请求体。
echo get_headers('http://127.0.0.1', 1)["Content-Type"]