仅使用尾部斜杠的 Nginx 反向代理

仅使用尾部斜杠的 Nginx 反向代理

你好,ServerFault 社区,

我在 Nginx 反向代理实现中遇到了很多问题,特别是关于尾部斜杠的处理。如果您能提供任何帮助或见解来帮助我解决此问题,我将不胜感激。

要求:

我有以下设置:

-DNS name: vpn.internal.example.com (publicly accessible) 
-VPN-Server for clients with an internal IP of 192.168.101.10 
-VPN-Server for staff with an internal IP of 192.168.101.6

我想要实现的目标:

当用户输入 URL 时vpn.internal.example.com/client/,我希望 Nginx 代理将它们重定向到后端服务器 192.168.101.10。随后,用户应该能够浏览网站,而无需在前端删除尾部斜杠。但是,在后端,从 VPN 服务器请求数据时应该删除尾部斜杠。

示例 URL:

-vpn.internal.example.com/client/login
-vpn.internal.example.com/client/dashboard
-vpn.internal.example.com/client/users

同样的原则也适用于 vpn.internal.example.com/staff/ 以及员工对应的 URL。

-vpn.internal.example.com/staff/login
-vpn.internal.example.com/staff/dashboard
-vpn.internal.example.com/staff/users

我的问题:

我遇到了以下问题:

  1. 有时当我输入 vpn.internal.example.com/client/ 或 vpn.internal.example.com/staff/ 时,URL 会重定向到 vpn.internal.example.com。

  2. 有时,URL 会保持为 vpn.internal.example.com/client/,但如果我输入 /staff/,它会重定向回客户端的 VPN 或无法正常工作。

  3. 如果我手动输入 vpn.internal.example.com/staff/login,则会显示登录页面。但是,如果我使用员工 VPN 服务器凭据,则会显示“身份验证无效”。令人惊讶的是,如果我使用客户端的 VPN 服务器凭据,它会起作用,但会将我重定向回 vpn.internal.example.com。

配置:

以下是我一直使用的 Nginx 配置文件:

upstream vpn-client {
    server 192.168.101.10:443;
}

upstream vpn-staff {
    server 192.168.101.6:443;
}

server {
    listen 80;
    listen [::]:80;
    root /usr/share/nginx/html;
    server_name vpn.internal.example.com;
    location /.well-known {
        allow all;
    }
    location /student {
        return 301 https://vpn.internal.example.com/client$request_uri;
    }
    location /staff {
        return 301 https://vpn.internal.example.com/staff$request_uri;
    }
    location / {
        return 301 https://vpn.internal.example.com$request_uri;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate /etc/nginx/ssl/vpn.internal.example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/vpn.internal.example.com.key;
    server_name vpn.internal.example.com;
    location /student/ {
        proxy_pass https://vpn-client/;
        proxy_ssl_verify off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    location /staff/ {
        proxy_pass https://vpn-staff/;
        proxy_ssl_verify off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    location / {
        proxy_pass https://vpn-client$request_uri;
        proxy_ssl_verify off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

结论:

我感觉我可能使配置过于复杂,并且用尽了我关于如何解决这个问题的想法,我希望有人可以为我指明方向。

相关内容