web-dev-qa-db-ja.com

PHPでリクエストの「Content-Type」ヘッダーを取得する

PHPでRESTサービスを実装しています。このサービスは、複数の入力形式と出力形式(JSON、XML)をサポートできるはずです。そのため、リクエストヘッダーを確認します"Accept"および"Content-Type"クライアントによって送信および要求されたコンテンツのタイプ。

"Accept"ヘッダーへのアクセスは、_$_SERVER['HTTP_ACCEPT']_を使用するのと同じくらい簡単です。しかし、"Content-Type"ヘッダーにアクセスするのは難しい作業のようです。 PHPドキュメントとWebを検索しましたが、提供される唯一の解決策は、サポートされているPHP function Apache_request_headers()の使用のみでしたwhen PHPはApacheモジュールとしてインストールされますが、私の場合はそうではありません。

だから私の質問:リクエストのヘッダー「Content-Type」にアクセスするにはどうすればよいですか?

44
CodeZombie

通常(GET)リクエストにはContent-Typeヘッダーがありません。 POSTリクエストの場合、 $_SERVER["CONTENT_TYPE"]、multipart/form-dataやapplication/x-www-form-urlencodedなどの値を使用します。

これは、CGI/1.1仕様で義務付けられています: http://www.ietf.org/rfc/rfc3875

54
mario

_Content-Type_ヘッダー(および必要なその他のヘッダー)を提供するようにApacheに手動で指示する必要があります。

_.htaccess_ファイルまたは仮想ホストで次のようなものをポップします。

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

そして出来上がり、あなたはあなただけの_$_SERVER['HTTP_CONTENT_TYPE']_を合成しました!

編集:

ApacheでPHPをCGIとして実行しているため、ほとんどのレストサービスと同様に、GETとPOST以外の動詞を使用できます。別のWebサーバーまたはほとんど知られていないPHP SAPIを使用している場合、同様のトリックを使用する必要があります。 PHPはCGIが_$_SERVER_のコンテンツ以外のリクエストヘッダーにアクセスできないため、使用する他のメカニズムに関係なく-_$_ENV_、Apache_request_headers()、 _php_http_拡張機能のクラスもすべて空になります。

20
Neil E. Pearson

これでコンテンツタイプ(「text/html」など)を取得することもできます。

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

または

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

更新

ベンジャミンが言ったように、Apache_request_headersは、5.4.0のFastCGIおよび5.5.7以降の内部PHP server)で使用可能です。

5
Fabien Sa