nginx,rewrite,proxy_pass,post資料,表單
今天接到一個需求,前臺要呼叫後臺的簡訊傳送閘道器:必須以post形式傳遞引數,並且前臺的傳送簡訊的請求的url和後臺的傳送簡訊的url不一致
前臺的url為http://xxx.test.com/ajax/mobiledynamiclogincode
後臺的傳送簡訊閘道器的url為:
http://xxx2.test.com/json/account/mobiledynamiclogincode
分析:
1、nginx中的rewrite到外部url會導致post的引數丟失,所以放棄該方案。(內部的rewrit是不會丟失post資料)
原因:
(1)post的時候,引數是存放在message body中傳遞的,對於內部的url調轉,因為是相同的一次請求,所以message body(request body)沒變,所以post資料不會丟失。
(2)而對於外部跳轉,實際上是一次302,即使用者在請求了一次,所以第二次就不會post第一次的資料了。
具體如下:你post資料之後,匹配到rewrite之後,因為是外部的url,使用者會看到一個302,之後請求的url就變成了get。。那麼之前post的資料就丟失了(因為使用者沒有再提交一次資料)
2、需要傳遞post引數,需要使用proxy_pass。同時,因為proxy之前的url和proxy的url不同,需要做location,並需要在在proxy_pass中寫全路徑參考例子如下
思考了為啥proxy_pass能傳遞post的引數:因為對於使用者而言,就只是一個請求,所以request body沒變。nginx會將該request body傳遞到後續的server
location /ajax/mobiledynamiclogincode {
proxy_pass http://xxx2.test.com/json/account/mobiledynamiclogincode;
}