需求
根据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;
}
测试
- 参数含devreg,则nginx 直接输出
curl http://127.0.0.1:8080/api/interface?t=1&xmlString=devreg&x=111
- 参数不含 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已包含,并且原始的参数都在
后记
发现在真实项目中(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;
}