【问题标题】:Nginx proxy_pass redirect to URL from query stringNginx proxy_pass 从查询字符串重定向到 URL
【发布时间】:2018-03-15 04:09:53
【问题描述】:

我正在使用 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”,这就是我要访问的 url。 我尝试在 proxy_pass 中对 URL 进行硬编码,并且成功了:

location /proxydownload {
    proxy_pass http://www.test.com/d/guid/download;
}

我使用 $arg_url 的方式有什么不对吗?

【问题讨论】:

  • 您应该阅读this,看起来您正在尝试使用 nginx 实现 Web 代理。
  • @user3780601,这两个答案还缺少什么吗?如果不是,请接受最佳答案。如果您在宽限期的接下来几个小时内没有采取任何行动,至少一半的赏金将不可挽回地损失。

标签: nginx query-string proxypass


【解决方案1】:

发生这种情况是因为当您硬编码传递给 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)。

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多