【问题标题】:Get "Content-Type" header of request in PHP在 PHP 中获取请求的“Content-Type”标头
【发布时间】:2011-07-28 01:09:58
【问题描述】:

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

访问 "Accept" 标头就像使用 $_SERVER['HTTP_ACCEPT'] 一样简单。但是访问 "Content-Type" 标头似乎是一项艰巨的任务。我搜索了 PHP 文档和网络,但提供的唯一解决方案是使用 PHP 函数 apache_request_headers(),仅当 PHP 作为 Apache 模块安装时才受支持,但在我的情况下并非如此。

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

【问题讨论】:

  • 请记住,$_SERVER["CONTENT_TYPE"] 并不总是可用。

标签: php http rest http-headers


【解决方案1】:

普通 (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。希望它在不久的将来得到修复。 bugs.php.net/bug.php?id=66606&thanks=6
  • 虽然不常见,但 GET 请求可以具有 Content-Type 标头,并且可以包含请求正文。
【解决方案2】:

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

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

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

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

编辑:

我假设您将 PHP 作为 CGI 与 Apache 一起运行,因此您可以使用除 GET 和 POST 之外的动词,就像大多数其他服务一样。如果您正在使用另一个 Web 服务器或大部分闻所未闻的 PHP SAPI,您将需要使用类似的技巧; PHP 作为 CGI 根本无法访问 $_SERVER 内容之外的请求标头,无论您使用什么其他机制 - $_ENV、apache_request_headers(),甚至 php_http 扩展中的类都将为空。

【讨论】:

  • 谢谢,成功了!我印象深刻:-)
  • PHP/Apache 钻机上 REST 服务的老问题。我强调将虚拟主机与应用程序一起分发,因为它们通常会变得非常庞大。很高兴它起作用了:)
  • @NeilE.Pearson 有没有办法在标题中允许charset?我是having problems,它接受它。
  • 这不需要 mod_rewrite SetEnvIfNoCase ^Content-Type "(.+)" CONTENT_TYPE=$1
  • 这应该是选择的答案!
【解决方案3】:

您也可以通过以下方式获取内容类型(如“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 服务器。

【讨论】:

  • 感谢您的信息。来自文档:“这些功能仅在将 PHP 作为 Apache 模块运行时可用。”。据我所知,PHP 经常使用 FastCGI 运行。这正是我的场景中的情况。我个人更喜欢$_SERVER["CONTENT_TYPE"],看起来干净多了。
  • 请注意,apache_request_headers() 在 PHP 5.4.0 的 FastCGI 下可用
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 2014-05-23
相关资源
最近更新 更多