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

Cod*_*bie 45 php rest http http-headers

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

访问"Accept"标题非常简单$_SERVER['HTTP_ACCEPT'].但访问"Content-Type"标题似乎是一项艰巨的任务.我搜索了PHP文档和Web,但唯一提供的解决方案是使用PHP函数apache_request_headers(),只有当PHP作为Apache模块安装时才支持,这在我的情况下是不正确的.

所以现在我的问题是:如何访问请求的标题"Content-Type"?

mar*_*rio 56

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

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

  • 内置的PHP服务器有一个记录的错误报告.它应该返回`CONTENT_TYPE`,而是返回`HTTP_CONTENT_TYPE`.希望它在不久的将来得到修复.https://bugs.php.net/bug.php?id=66606&thanks=6 (7认同)
  • 尽管不常见,但 GET 请求可以具有 Content-Type 标头,并且可以包含请求正文。 (3认同)

Nei*_*son 20

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

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

RewriteEngine on
RewriteRule .* - [E=HTTP_CONTENT_TYPE:%{HTTP:Content-Type},L]
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我假设您使用Apache将PHP作为CGI运行,因此您可以使用除GET和POST之外的动词,就像大多数其他服务一样.如果您正在使用其他Web服务器或者基本上闻所未闻的PHP SAPI,您将需要使用类似的技巧; PHP作为CGI根本没有获得要求的内容外头$_SERVER,不管你用什么样的机制- $_ENV,apache_request_headers()即使在类php_http的扩展都将是空的.


Fab*_* Sa 5

您还可以使用以下内容获取内容类型(如"text/html"):

echo split(',', getallheaders()['Accept'])[0];
Run Code Online (Sandbox Code Playgroud)

要么

echo get_headers('http://127.0.0.1', 1)["Content-Type"]
Run Code Online (Sandbox Code Playgroud)

更新

就像Benjamin所说,apache_request_headers可以从5.4.0获得FastCGI,从5.5.7开始提供内部PHP服务器.

  • 注意,在PHP 5.4.0的FastCGI下可以使用`apache_request_headers()` (2认同)