【问题标题】:NGINX Proxy pass to external site that has internal redirectNGINX 代理传递到具有内部重定向的外部站点
【发布时间】:2022-01-28 16:03:08
【问题描述】:

我正在尝试配置一个 nginx 代理,该代理通过代理传递隐藏内部站点,但没有成功。 我使用的配置是

location /internal1/ {
   proxy_set_header X-Forwarded-Host $host;
   proxy_set_header X-Forwarded-Server $host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_connect_timeout 15;
   proxy_read_timeout 180;
   proxy_pass http://internal1/;
}

upstream internal1 {
   server a.b.c.d:80;
}

问题是,当我尝试访问 a.b.c.d 站点时,它会重定向到一个应该是 http://a.b.c.d/login 的登录页面,而在我登录后它会重定向到另一个页面 http://a.b.c.d/device/config 。使用代理它重定向到 http://mysite/login 和 http://mysite/device/config

使代理不起作用并显示资源未找到并且我看不到任何页面。

如果我将 proxy_pass 值更改为 http://a.b.c.d/login/ 它会在 http://mysite/internal1 显示登录页面,并且在我登录后它显示未找到资源,因为它尝试访问 http://mysite/device/config。

有人对如何以正确的方式配置它有一些建议吗?

感谢大家的回答

编辑: 抱歉,回答迟了,但与此同时我很忙,无论如何,该解决方案适用于 1 个设备,但现在我连接的所有设备都只进入该设备的“内部”页面,我无法区分更多原因,因为 nginx 不支持相同的位置多个配置(所有设备都有 ip/page1)

location /page1/
{ 
 proxy_pass mysite/internal1/page1;
 proxy_redirect off;
 proxy_set_header Host $host;
}

编辑2: 不幸的是,不可能将所有设备直接暴露在互联网上。我找到的解决方案是:

创建一个自定义 DNS 子域,然后为每个设备创建一个不同的 nginx 服务器块,每个设备都有自己的位置和未来的重定向/代理 ecc...

【问题讨论】:

  • 您应该将主网站显示为/main,将隐藏网站显示为/internal - 使用2 个location 块。然后,您将拥有一个包罗万象的位置 / - 它会像 /internal 一样使用 proxy_pass。通过这种方式,您将能够区分主站点和隐藏站点 - 以便当内部站点重定向到不是 /main 的内容时,您将能够捕获它。
  • 我尝试使用您的解决方案,并且仅对登录页面而非下一页进行了更多配置工作。基本上,当它转到site/internal 时,它会正确显示a.b.c.d./login 页面,但随后又没有资源显示。
  • 也许内部站点在重定向中使用其 IP 地址而不是其域名?您可能需要更改其代码以使用 Host HTTP 标头。
  • 不幸的是,内部网站是一个显示网页的设备,我无法改变它的工作方式
  • 那么您必须重写从设备返回的Location 标头,然后再将其发送回浏览器。

标签: nginx nginx-reverse-proxy


【解决方案1】:

如果您想公开所有位于内部网络中的设备的 Web UI,以便通过 Internet 访问 - 那么您必须为每个设备创建一个子域(以及相应的虚拟主机配置)。

假设指向您的 nginX 的域是 mydevices.net,并且您有 2 台设备 - 在 192.168.2.10 和 192.168.2.20 上

那么您的 nginX 配置将如下所示:

server {
  listen 80;
  server_name dev1.mydevices.net;

  location / {
    proxy_pass internal1;
    proxy_redirect default;
  }
}

upstream internal1 {
   server 192.168.2.10;
}

server {
  listen 80;
  server_name dev2.mydevices.net;

  location / {
    proxy_pass internal2;
    proxy_redirect default;
  }
}

upstream internal2 {
   server 192.168.2.20;
}

【讨论】:

    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2012-08-02
    • 2014-05-26
    • 2019-07-26
    • 2016-03-05
    • 2012-01-27
    相关资源
    最近更新 更多