nginx,rewrite,proxy_pass,post数据,表单

来源:互联网 发布:java面向对象 编程题 编辑:程序博客网 时间:2024/05/18 03:37

今天接到一个需求,前台要调用后台的短信发送网关:必须以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;

}

原创粉丝点击