2013-03-12 1006 views
0

我正在使用nginx進行PHP REST API工作。爲了完全恢復,我在適當時使用PUT/DELETE請求。但是,PHP不會解析PUT請求中的帖子正文 - 這是我需要的特定場景。Nginx將請求從PUT改爲POST

我曾經考慮過自己解析它,但是a)我寧願讓PHP在C中執行它,因爲它比我能在PHP中實現的任何實現都快得多,並且b)有很多邊緣情況下的人已經花了很多時間在工作 - 我寧願不重複這些努力。

在API方面,我已經添加了支持來閱讀X-HTTP-Method-Override標題,並在實際動詞中使用該標題。

我正在尋找的所有內容都是在nginx中採取PUT請求的方法,並將其更改爲帶有該標頭集的POST請求。

我覺得ike我已經找遍了所有的地方,但找不到解決方案。任何事情都會有幫助(即使你推薦不同的解析技術,所以我不必處理這個問題)。

回答

1

Nginx只通過REQUEST_METHOD參數告知FastCGI的請求方法。所以你可以簡單地覆蓋這個值並向PHP報告任何你想要的東西。你必須聲明另一個變量的Nginx的配置,讓我們將其命名爲$fcgi_method,在原有基礎上請求方法:

map $request_method $fcgi_method { 
    default $request_method; 
    PUT POST; 
} 

(注意map部分應在http水平,即相同的配置水平server塊)

然後你可以用它在你的位置,就像這樣:

fastcgi_param REQUEST_METHOD $fcgi_method; 

重要的是,這個片段是典型的後include fastcgi_params或類似。

+0

哇 - 你是絕對正確的。這是我從Apache的世界中獲得的。 – 2013-03-12 13:16:37

+0

這不起作用:nginx:[emerg]「fastcgi_param」指令在/ etc/nginx/sites-enabled/xxxxx中不允許:x – Philio 2014-09-21 16:07:11

+0

@Philio哦,你是對的。我已經更正了答案 – 2014-09-23 15:41:51

0

我認爲值得指出的是,如果其他人認爲這種方法在PHP中處理PUT請求(或任何其他請求方法未填充到某個全局$ _WHATEVER數組中以使生活變得輕鬆),那麼正確的方法得到一個放入請求的正文是讀取php://input的內容。

像這樣的東西應該工作:

$data = file_get_contents("php://input");