Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获得;“内容类型”;PHP中的请求头_Php_Http_Rest_Http Headers - Fatal编程技术网

获得;“内容类型”;PHP中的请求头

获得;“内容类型”;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模块安装时才受支持,在

我正在用PHP实现一个REST服务。该服务应该能够支持多种输入和输出格式(JSON、XML)。出于这个原因,我想检查请求头“Accept”和“contenttype”中客户端发送和请求的内容类型

使用
$\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_rewrite
SetEnvIfNoCase^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"]