Nginx 反向代理将子目录路由到根位置代理路径在每个浏览器会话访问首页时

Nginx 反向代理将子目录路由到根位置代理路径在每个浏览器会话访问首页时

简而言之:我在 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”,但我不明白为什么。这就是为什么我认为浏览器是问题的一部分,但我如何告诉它们不要进行这种重定向?

相关内容