nginx反向代理后面的服务器忽略URL中的相对路径

时间:2014-07-08 14:13:21

标签: nginx reverse-proxy

我的头衔不是最好的,我对网络的了解非常基本,对不起。

我想要实现的目标

我在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/;
      }

  }

第一个答案后

在前几个答案之后(谢谢!),我意识到我的设置很不常见,而且我可能一个人都会遇到麻烦。

在不触及前端端口和域名/主机名的情况下访问防火墙后面的网络服务器会更好吗?

2 个答案:

答案 0 :(得分:1)

您可能希望考虑使用设置proxy_redirect让nginx知道它应该将“后端”服务器响应标头(位置和刷新)修改为适当的前端URL。您可以使用default设置允许nginx根据locationproxy_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