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

前端之家收集整理的这篇文章主要介绍了nginx反向代理后面的服务器忽略URL中的相对路径前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

我想要实现的目标

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

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

我在防火墙后面有两个web服务器,web1.lan,web2.lan,web2ilo.lan.这两个应用程序都有各种应用程序(可能在不同的机器上具有相同的名称),可以通过标准URL直接在LAN上访问(名称作为示例给出,我无法控制内容):

  1. http://web1.lan/PHPAdmin/
  2. http://web1.lan/gallery/
  3. http://web2.lan/PHPAdmin/
  4. http://web2.lan/dlna/

…等等…

现在web2ilo.lan就是一个特例.它是HP服务器web2.lan的带外管理Web界面.该特定网络服务器仅提供1个应用程序,因此只能通过其根URL访问:

  1. http://web2ilo/login.html

我的目标是通过home.net的子路径访问这些,如下所示:

  1. http://home.net/web1/PHPAdmin/
  2. http://home.net/web1/gallery/
  3. http://home.net/web2/PHPAdmin/
  4. http://home.net/web2/dlna/
  5. http://home.net/web2ilo/login.html

我的问题

这几乎可以工作,但Web应用程序倾向于重写URL,以便在我登录后分别:

  1. http://home.net/web1/PHPAdmin/login.PHP
  2. http://home.net/web2ilo/login.html

浏览器分别重定向

  1. http://home.net/PHPAdmin/index.PHP
  2. http://home.net/index.html

请注意,相对子路径web1和web2ilo已经消失了,逻辑上给了我404.

我的配置

到目前为止,我已经搜索了很多,我在Nginx中尝试了很多选项而不太了解我在做什么.这是我的配置,重现了这个问题.为了清楚起见,我已经离开了SSL.

  1. server {
  2. listen 443 ssl;
  3. server_name localhost;
  4. # SSL stuff left out for clarity
  5. location / {
  6. root /usr/share/Nginx/html;
  7. index index.html index.htm;
  8. }
  9. location /web1/ {
  10. proxy_set_header Host $host;
  11. proxy_redirect off;
  12. proxy_pass https://web1.lan/;
  13. }
  14. location /web2/ {
  15. proxy_set_header Host $host;
  16. proxy_redirect off;
  17. proxy_pass https://web2.lan/;
  18. }
  19. location /web2ilo/ {
  20. proxy_set_header Host $host;
  21. proxy_redirect off;
  22. proxy_pass https://web2ilo.lan/;
  23. }
  24. }

在第一个答案后

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

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

最佳答案
您可能希望考虑使用设置proxy_redirect让Nginx知道它应该将“后端”服务器响应头(位置和刷新)修改为适当的前端URL.您可以使用默认设置来允许Nginx根据您的位置和proxy_pass指令计算适当的值,或者显式指定如下的映射:

  1. 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).这将需要为每个应用程序添加位置指令,例如,

  1. location /PHPAdmin/ {
  2. proxy_set_header Host $host;
  3. proxy_redirect off;
  4. proxy_pass https://web1.lan/PHPAdmin/;
  5. }

猜你在找的Nginx相关文章