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

发布于 2024-10-29 11:16:45 字数 371 浏览 3 评论 0原文

我正在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

喜你已久 2024-11-05 11:16:45

普通 (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.

死开点丶别碍眼 2024-11-05 11:16:45

您需要手动指示 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 内容之外的请求标头,无论您使用什么其他机制 - $_ENVapache_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:

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

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 the php_http extension will all be empty.

轮廓§ 2024-11-05 11:16:45

您还可以通过以下方式获取内容类型(例如“text/html”):

echo split(',', getallheaders()['Accept'])[0];

echo get_headers('http://127.0.0.1', 1)["Content-Type"]

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 :

echo split(',', getallheaders()['Accept'])[0];

or

echo get_headers('http://127.0.0.1', 1)["Content-Type"]

Update

Like Benjamin said, apache_request_headers is available with FastCGI from 5.4.0 and from internal PHP server since 5.5.7.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文