美文网首页Nginx高端成长之路
Nginx根据GET参数做前端代理,并增加参数

Nginx根据GET参数做前端代理,并增加参数

作者: 勤劳一沙鸥 | 来源:发表于2017-12-18 16:29 被阅读13次

需求

​ 根据URL的参数,如果不包含关键字 devreg 则走地址A,并增加额外的GET参数 r=interface

用例规划

1. 访问 http://127.0.0.1:8080/api/interface?t=1&xmlString=devreg&x=111 得到本网站的内容
2. 访问 http://127.0.0.1:8080/api/interface?t=1&xmlString=getbin&x=111 跳转到新地址,并且新地址中可以得到参数 r=interface xmlString=getbin

方案

遇到最大的问题就是 proxy_pass 必须写在 if 里,而此时 proxy_pass 只能填写ip及端口信息,不能再添加任何额外参数。

通过搜索各类文档,使用 rewrite 和 proxy_pass 结合的方式,完成目标。贴出结果

  location /api/interface {
      if ( $arg_xmlString !~* '(.*devreg.*)' ) {
          # proxy_pass  http://127.0.0.1:8008;
          rewrite ^ /api/interface2proxy_pass?r=interface;
      }
  }
  location /api/interface2proxy_pass {
      proxy_pass http://127.0.0.1:8008/eshow/index.php;
  }

测试

  1. 参数含devreg,则nginx 直接输出
curl http://127.0.0.1:8080/api/interface?t=1&xmlString=devreg&x=111
  1. 参数不含 devreg,应该输出 :8008服务的内容
curl http://127.0.0.1:8080/api/interface?t=1&xmlString=devr1eg&x=111

可以在8008的监听窗口中看到访问内容:/eshow/index.php?r=interface&t=1&xmlString=devr1eg&x=111

额外增加的 r=interface已包含,并且原始的参数都在

参考:在Nginx中修改请求的一个参数值

后记

发现在真实项目中(Laravel环境),对外的可以正常转发出去。对内的却没有正常到达Laravel,需要加一个try_files $uri $uri/ /laravel.php?$query_string;,直接进入Laravel环境即可。

location /api/interface {
  if ( $arg_xmlString !~* '(.*devicereg.*)' ) {
        rewrite ^ /api/interface2proxy_pass?r=interface;
    }
    try_files $uri $uri/ /laravel.php?$query_string;
}
location /api/interface2proxy_pass {
    proxy_pass http://eshowcloud.com/eshow/index.php;
}
location / {
    try_files $uri $uri/ /laravel.php?$query_string;
}

相关文章

网友评论

    本文标题:Nginx根据GET参数做前端代理,并增加参数

    本文链接:https://www.haomeiwen.com/subject/xtumwxtx.html