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」にアクセスするにはどうすればよいですか?
通常(GET)リクエストにはContent-Type
ヘッダーがありません。 POSTリクエストの場合、 $_SERVER["CONTENT_TYPE"]
、multipart/form-dataやapplication/x-www-form-urlencodedなどの値を使用します。
これは、CGI/1.1仕様で義務付けられています: http://www.ietf.org/rfc/rfc3875 。
_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
_拡張機能のクラスもすべて空になります。
これでコンテンツタイプ(「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)で使用可能です。