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

我的头衔并不是最好的,我对网络的了解非常基础,对不起.

我想要实现的目标

我有一个在Archlinux上运行nginx的盒子风箱,我用它作为我的家庭局域网的主要入口点从互联网(即工作,我只能到达端口80和443)通过反向代理设施使用不断变化的域名我无法控制,我们现在会打电话给home.net.

fanbox的端口80和443映射到home.net,这部分很容易.

我在防火墙后面有两个web服务器,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/;
      }

  }

在第一个答案后

在第一个答案之后(谢谢!),我意识到我的设置远非常见,而且我可能会独自遇到麻烦.

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

最佳答案
您可能希望考虑使用设置proxy_redirect让nginx知道它应该将“后端”服务器响应头(位置和刷新)修改为适当的前端URL.您可以使用默认设置来允许nginx根据您的位置和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 /phpAdmin/ {
     proxy_set_header Host $host;
     proxy_redirect off;
     proxy_pass https://web1.lan/phpAdmin/;
}         

相关文章

文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、N...
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的...
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时...
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+...
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以...
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx ...