【发布时间】: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 地址而不是其域名?您可能需要更改其代码以使用
HostHTTP 标头。 -
不幸的是,内部网站是一个显示网页的设备,我无法改变它的工作方式
-
那么您必须重写从设备返回的
Location标头,然后再将其发送回浏览器。