Nginx proxy_pass 从查询字符串重定向到 URL
Nginx proxy_pass redirect to URL from query string
我正在使用 Nginx 并尝试使用 proxy_pass 重定向到作为查询字符串出现的 URL。我还想避免将任何其他参数传递给 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”,这就是我要命中的 url。
我尝试在 proxy_pass 中对 URL 进行硬编码并且它起作用了:
location /proxydownload {
proxy_pass http://www.test.com/d/guid/download;
}
是不是我使用$arg_url的方式有问题?
将 proxy_pass
与变量一起使用是一个复杂且缺乏记录的雷区。
我假设你的 502 错误是 "no resolver defined to resolve ..."
在这种情况下,您需要安装绑定 (yum install bind) 并将解析器添加到您的配置中。
location /proxydownload {
resolver 127.0.0.1 [::1];
proxy_pass $arg_url;
}
使用 Google 的 8.8.8.8
等外部解析器无需绑定即可工作,但 Potential Security Issues.
发生这种情况是因为当您硬编码传递给 http://nginx.org/r/proxy_pass, without using any variables, then the default resolver, from /etc/resolv.conf 的值时,会在解析和加载配置时使用 - IP 地址的任何后续更改都不会被提取。
如果您使用变量,那么您也必须使用 http://nginx.org/r/resolver directive to specify a 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)。
我正在使用 Nginx 并尝试使用 proxy_pass 重定向到作为查询字符串出现的 URL。我还想避免将任何其他参数传递给 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”,这就是我要命中的 url。 我尝试在 proxy_pass 中对 URL 进行硬编码并且它起作用了:
location /proxydownload {
proxy_pass http://www.test.com/d/guid/download;
}
是不是我使用$arg_url的方式有问题?
将 proxy_pass
与变量一起使用是一个复杂且缺乏记录的雷区。
我假设你的 502 错误是 "no resolver defined to resolve ..."
在这种情况下,您需要安装绑定 (yum install bind) 并将解析器添加到您的配置中。
location /proxydownload {
resolver 127.0.0.1 [::1];
proxy_pass $arg_url;
}
使用 Google 的 8.8.8.8
等外部解析器无需绑定即可工作,但 Potential Security Issues.
发生这种情况是因为当您硬编码传递给 http://nginx.org/r/proxy_pass, without using any variables, then the default resolver, from /etc/resolv.conf 的值时,会在解析和加载配置时使用 - IP 地址的任何后续更改都不会被提取。
如果您使用变量,那么您也必须使用 http://nginx.org/r/resolver directive to specify a 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)。