[英]Get “Content-Type” header of request in PHP
我正在用PHP實現REST服務。 該服務應該能夠支持多種輸入和輸出格式(JSON,XML)。 出於這個原因,我想檢查請求標題“Accept”和“Content-Type” ,了解客戶端發送和請求的內容類型。
訪問“Accept”標頭很簡單,就像使用$_SERVER['HTTP_ACCEPT']
。 但訪問“Content-Type”標題似乎是一項艱巨的任務。 我搜索了PHP文檔和Web,但提供的唯一解決方案是使用PHP函數apache_request_headers()
,僅當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 。
您需要手動指示Apache提供Content-Type
標頭(以及您想要的任何其他標頭)。
在.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"]
更新
就像Benjamin所說, apache_request_headers
可用於5.4.0的FastCGI和5.5.7以后的內部PHP服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.