你好,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
我的问题:
我遇到了以下问题:
有时当我输入 vpn.internal.example.com/client/ 或 vpn.internal.example.com/staff/ 时,URL 会重定向到 vpn.internal.example.com。
有时,URL 会保持为 vpn.internal.example.com/client/,但如果我输入 /staff/,它会重定向回客户端的 VPN 或无法正常工作。
如果我手动输入 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;
}
}
结论:
我感觉我可能使配置过于复杂,并且用尽了我关于如何解决这个问题的想法,我希望有人可以为我指明方向。