qqruser 发表于 2018-11-9 10:26:39

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

  个人微博:http://weibo.com/h2fly
  欢迎技术交流
  今天接到一个需求,前台要调用后台的短信发送网关:必须以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;
  }
  个人微博:http://weibo.com/h2fly
  欢迎技术交流

页: [1]
查看完整版本: nginx,rewrite,proxy_pass,post数据,表单