我正在使用Nginx并尝试使用proxy_pass重定向到作为查询字符串的URL。我还想避免将任何其他参数传递给该URL。
这是我发送给代理的网址: http://10.10.10.10/proxydownload?url=http://www.test.com/d/guid/download&session=123
这就是我在nginx.conf中所拥有的:
location /proxydownload {
proxy_pass $arg_url;
}
但是,这会产生502错误,我不知道为什么。根据日志,$ arg_url包含“http://www.test.com/d/guid/download”,这就是我要点击的网址。 我试图在proxy_pass中对URL进行硬编码,但它确实有效:
location /proxydownload {
proxy_pass http://www.test.com/d/guid/download;
}
我使用$ arg_url的方式有什么不对吗?
答案 0 :(得分:3)
之所以会发生这种情况,是因为当您在不使用任何变量的情况下对传递给http://nginx.org/r/proxy_pass的值进行硬编码时,会在解析和加载配置时使用/etc/resolv.conf中的默认解析器-任何随后的IP地址更改将不会被接收。
相反,如果使用变量,则还必须使用http://nginx.org/r/resolver指令来指定解析器。 Note that you can still use a DNS name when specifying a resolver,但请记住,在配置加载或重新加载时,该名称可能只会被解析一次。当然,按照Dayo的回答,最好使用本地DNS解析器以获得最佳安全性,但是例如,如果您知道所有域都将委派给某个权威名称服务器,例如包括ns2.he.net.
,那么您也可以简单地将服务器指定为resolver
。
但是,谈到安全性,信任用户的输入来规范上游服务器似乎不是一个好主意。这是大大增加攻击媒介的因素之一–既将服务器作为免费的proxy_pass
使用到互联网上的任何地方(可能耗尽资源以供有效使用),也可能被恶意软件利用攻击者试图通过由攻击者控制的恶意上游服务器来利用nginx中的潜在漏洞(例如,看看CVE-2013-2070)。
答案 1 :(得分:0)
将proxy_pass
与变量一起使用是一个复杂且记录薄弱的雷区。
我认为您的502错误是“未定义解析器来解析...”
在这种情况下,您需要安装bind(yum install bind)并将解析器添加到您的配置中。
location /proxydownload {
resolver 127.0.0.1 [::1];
proxy_pass $arg_url;
}
使用外部解析器(例如Google的8.8.8.8
)无需绑定即可工作,但是有Potential Security Issues。