获取“内容类型” PHP 中的请求头
我正在 PHP 中实现 REST 服务。该服务应该能够支持多种输入和输出格式(JSON、XML)。因此,我想检查请求标头“Accept”和“Content-Type”以了解客户端发送和请求的内容类型。
访问“Accept”标头非常简单,只需使用 $_SERVER['HTTP_ACCEPT']
即可。但访问“Content-Type”标头似乎是一项艰巨的任务。我搜索了 PHP 文档和网络,但提供的唯一解决方案是使用 PHP 函数 apache_request_headers()
,该函数仅在 PHP 作为 Apache 模块安装时才受支持,但在我的示例中并非如此。案件。
所以我现在的问题是:如何访问请求的标头“Content-Type”?
I'm implementing a REST service in PHP. This service should be able to support multiple input and output formats (JSON, XML). For that reason I want to check the request headers "Accept" and "Content-Type" for the type of content sent and requested by the client.
Accessing the "Accept" header is a simple as using $_SERVER['HTTP_ACCEPT']
. But accessing the "Content-Type" header seems to be a difficult task. I searched the PHP documentation and the web, but the only solution offered was the use of the PHP function apache_request_headers()
which is only supported when PHP is installed as an Apache module, which is not true in my case.
So my question now: How can I access the header "Content-Type" of a request?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
普通 (GET) 请求没有
Content-Type
标头。对于 POST 请求,它将显示为$_SERVER["CONTENT_TYPE"]
,其值类似于 multipart/form-data 或 application/x-www-form-urlencoded。这是 CGI/1.1 规范强制规定的:http://www.ietf.org/rfc/rfc3875。
Normal (GET) requests do not have a
Content-Type
header. For POST requests it would appear as$_SERVER["CONTENT_TYPE"]
, with a value like multipart/form-data or application/x-www-form-urlencoded.This is mandated by the CGI/1.1 specification: http://www.ietf.org/rfc/rfc3875.
您需要手动指示 Apache 提供
Content-Type
标头(以及您想要的任何其他标头)。在您的
.htaccess
文件或虚拟主机中弹出类似的内容:瞧,您刚刚合成了自己的
$_SERVER['HTTP_CONTENT_TYPE']
!编辑:
我假设您将 PHP 作为 CGI 与 Apache 一起运行,因此您可以使用 GET 和 POST 以外的动词,就像大多数休息服务一样。如果您使用其他 Web 服务器或很大程度上闻所未闻的 PHP SAPI,则需要使用类似的技巧; PHP 作为 CGI 根本无法访问
$_SERVER
内容之外的请求标头,无论您使用什么其他机制 -$_ENV
、apache_request_headers()
,甚至php_http
扩展中的类也将全部为空。You'll need to manually instruct Apache to supply the
Content-Type
header (plus any other headers you want).Pop something like this in your
.htaccess
file or virtual host:And voila, you just synthesised your very own
$_SERVER['HTTP_CONTENT_TYPE']
!Edit:
I assume you're running PHP as CGI with Apache so you can use verbs other than GET and POST, as most rest services do. If you're using another web server or largely unheard-of PHP SAPI, you'll need to use a similar trick; PHP as CGI simply doesn't have access to request headers outside the contents of
$_SERVER
, no matter what other mechanisms you use -$_ENV
,apache_request_headers()
, even the classes in thephp_http
extension will all be empty.您还可以通过以下方式获取内容类型(例如“text/html”):
或
Update
就像 Benjamin 所说的那样,
apache_request_headers
在 FastCGI 5.4.0 和内部版本中可用PHP 服务器从 5.5.7 开始。You can also get the content type (like "text/html") with this :
or
Update
Like Benjamin said,
apache_request_headers
is available with FastCGI from 5.4.0 and from internal PHP server since 5.5.7.