簡體   English   中英

在PHP中獲取請求的“Content-Type”標頭

[英]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內容之外的請求標頭,無論你使用什么其他機制 - $_ENVapache_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM