nginx配置根据参数转发

需求:
因浏览器安全策略,在reference为https类型时,无法跳转获取http协议链接的数据。
因此,设计解决方案为:由程序将需要跳转的完整url作为参数pic_url的值,加入整个url内,所以需要在代理中实现中转,将请求转发给pic_url

url:
原:
https://n1-test.xxx.com/angentImg/?type=image&pic_url=http://www.wipo.int/branddb/jsp/data.jsp?SOURCE=EMTM&TYPE=jpg&KEY=014835301&qi=2-FbonCURiPwm/abnckAV

希望转发给:
http://www.wipo.int/branddb/jsp/data.jsp?SOURCE=EMTM&TYPE=jpg&KEY=014835301&qi=2-FbonCURiPwm/abnckAV

实现方法:

    location ~/angentImg/ {
      if ($query_string ~*  ^(.*)type=image&pic_url=(.*)$){
         set $pic_url $2;
         # set $pic_url $arg_pic_url
         proxy_pass $pic_url;
         }
    }
解释:  
1.set $1 $2 将$2变量的值赋值给$1变量
2.arg_(VAR_NAME)用来获取url后指定参数对应的值,比如arg_pic_url可以获取到连接中pic_url这个参数的值
3.$query_string 可以获取路径之后包含所有参数kv的string
4.但是如果要获取的参数本身也是一个url,且该url包含有自带的参数,例如在这个例子里,直接使用$pic_url只能捕获http://www.wipo.int/branddb/jsp/data.jsp?SOURCE=EMTM这一段值,它后方的&之后的参数是无法捕捉到。因此使用正则匹配,将pic_url=后方的字符串全部赋予给了变量$2,将流量转发向$2值的url

配置完上面这些后,发现链接还是无法打开,报错502:
这里写图片描述

怀疑目标url做了防盗链处理,但经过测试,这是个cdn地址,并没有配置防盗链,继续检查,发现nginx日志有异常记录:
这里写图片描述

域名无法解析?dns已经配置了呀,本地也是可以浏览器正常访问该图片url,尝试在nginx服务器上添加/etc/hosts 固定dns记录,发现依然有同样的报错,求助万能的google,找到了问题的原因:

在Ngnix中如果用变量作为反向代理的地址时,可能会出现“no resolver defined to resolve xxx.xxx”的问题,原因是 Nginx 0.6.18以后的版本中启用了一个resolver指令,在使用变量来构造某个server地址的时候一定要用resolver指令来指定DNS服务器的地址,所以解决这个问题的方法很简单:在nginx的配置文件中的http{}部分添加一行DNS解析即可,注意,要写在nginx配置的http{}内:

resolver 8.8.8.8 ipv6=off;

再次尝试,图片可以正常访问,检查浏览器控制台可以看到各项url参数均正常携带:
这里写图片描述

展开阅读全文
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值