简而言之:我在 nginx 代理后面有两个不同的服务器。当我尝试访问其中一个时,我总是被重定向到位于根位置的另一个服务器。这种情况只发生一次。日志表明,当我第一次输入地址时,Firefox/Chrome 不会向 nginx 发送 GET 请求。当我在 Firefox/Chrome 会话中第二次输入 URL 时,我将访问正确的服务器。
更长:在我的设置中,我在 docker 网络中有两个服务器,其中“https://server.app/”应该路由到“http://docker-server-1:80”,“https://server.app/client”应该传递到“http://docker-server-2:8090/client”。
我的 nginx 配置如下
events {}
http {
server {
server_name server.app;
listen 443 ssl;
ssl_certificate /etc/nginx/fullchain.pem;
ssl_certificate_key /etc/nginx/privkey.pem;
error_log /etc/nginx/nginx.log debug;
location /client {
proxy_pass http://docker-server-2:8090/client;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://docker-server-1:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
当我输入“https://server.app/client”时,我将在以下情况下到达正确的服务器:a) 我以 Firefox/Chrome 隐身模式打开此页面,b) 我使用简单而幼稚的工具(如 curl/wget),c) 我清除了 Firefox/Chrome 的缓存并且它们之前从未见过“https://server.app”或 d) 我附加 index.html 并输入“https://server.app/client/index.html”。
当我访问“https://server.app”并尝试稍后打开“https://server.app/client”时,页面“https://server.app”将在每个浏览器会话中加载一次。当我第二次输入子目录 URL 时,我将到达正确的服务器,直到我关闭浏览器并再次打开它。然后,当我输入“https://server.app/client”时,我将再次在“https://server.app”结束一次。
奇怪的是,当我使用非隐身 Firefox/Chrome 输入“https://server.app/client”时,我在 nginx 日志中看不到任何 GET 请求。当我输入“https://server.app/client”时,似乎两种浏览器都使用缓存版本的“https://server.app”,但我不明白为什么。这就是为什么我认为浏览器是问题的一部分,但我如何告诉它们不要进行这种重定向?