我的头衔不是最好的,我对网络的了解非常基本,对不起。
我在Archlinux上运行nginx的一个 fanbox 框,我用作互联网的家庭局域网的主要入口点(即我只能通过80和443端口工作)反向代理设施使用我无法控制的更改域名,我们现在将调用 home.net 。
fanbox 将其端口80和443映射到 home.net ,这部分很简单。
防火墙后面有2个网络服务器, web1.lan , web2.lan , web2ilo.lan 。这两个应用程序都有各种应用程序(可能在不同的机器上具有相同的名称),可以通过标准URL直接在LAN上访问(名称作为示例给出,我无法控制内容):
http://web1.lan/phpAdmin/
http://web1.lan/gallery/
http://web2.lan/phpAdmin/
http://web2.lan/dlna/
......等等......
现在 web2ilo.lan 是一个特例。它是HP服务器 web2.lan 的带外管理Web界面。该特定网络服务器仅提供1个应用程序,因此只能通过其根URL访问:
http://web2ilo/login.html
我的目标是通过 home.net 的子路径访问这些:
http://home.net/web1/phpAdmin/
http://home.net/web1/gallery/
http://home.net/web2/phpAdmin/
http://home.net/web2/dlna/
http://home.net/web2ilo/login.html
这几乎可以工作,但是Web应用程序倾向于重写URL,以便在我登录后分别:
http://home.net/web1/phpAdmin/login.php
http://home.net/web2ilo/login.html
浏览器分别重定向到
http://home.net/phpAdmin/index.php
http://home.net/index.html
请注意,相对子路径 web1 和 web2ilo 已经消失,这在逻辑上给了我404.
到目前为止,我已经搜索了很多,我在nginx中尝试了很多选项而不太了解我在做什么。这是我的配置,重现了这个问题。为了清楚起见,我已经离开了SSL。
server {
listen 443 ssl;
server_name localhost;
# SSL stuff left out for clarity
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /web1/ {
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass https://web1.lan/;
}
location /web2/ {
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass https://web2.lan/;
}
location /web2ilo/ {
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass https://web2ilo.lan/;
}
}
在前几个答案之后(谢谢!),我意识到我的设置很不常见,而且我可能一个人都会遇到麻烦。
在不触及前端端口和域名/主机名的情况下访问防火墙后面的网络服务器会更好吗?
答案 0 :(得分:1)
您可能希望考虑使用设置proxy_redirect
让nginx知道它应该将“后端”服务器响应标头(位置和刷新)修改为适当的前端URL。您可以使用default
设置允许nginx根据location
和proxy_pass
指令计算相应的值,也可以明确指定如下的映射:
proxy_redirect http://web1.lan/ /web1/
请参阅:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect
注意:这只会影响响应标头 - 而不会影响HTML内容中的任何链接或任何Javascript。
如果您遇到内容或Javascript中的链接问题,您可以修改后端服务器上的内容(您可能无法指明),或调整您的代理解决方案,使前端路径与后端的(例如,而不是http://frontend/web1/phpAdmin
你只有http://frontend/phpAdmin
)。这将需要为每个应用程序添加location
指令,例如,
location /phpAdmin/ {
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass https://web1.lan/phpAdmin/;
}
答案 1 :(得分:1)
这是一个经过测试的示例。
在我的docker-compose.yml中,使用演示图像 whoami 进行测试:
whoareyou:
image: "containous/whoami"
restart: unless-stopped
networks:
- default
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoareyou.rule=Path(`/whoareyou`)"
- "traefik.http.routers.whoareyou.entrypoints=web"
- "traefik.http.routers.whoareyou.middlewares=https-redirect@file"
- "traefik.http.routers.whoareyou-secure.rule=Path(`/whoareyou`)"
- "traefik.http.routers.whoareyou-secure.entrypoints=web-secure"
- "traefik.http.routers.whoareyou-secure.tls=true"
在我的config.yaml中,我有https重定向:
http:
middlewares:
https-redirect:
redirectScheme:
scheme: https