nginx proxy_pass 为所有请求返回相同的内容

nginx proxy_pass 为所有请求返回相同的内容

我有一个系统,它将 proxy_pass 连接到一堆 AWS 资源,因此 IP 一直在变化。为了避免不断重新加载 nginx,我将 proxy_pass 移至使用变量(部分有效)

原始区块:

location /folder/ {
    proxy_pass https://folder.site.com:8888/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_hide_header X-Frame-Options;
}

新区块:

location /folder/ {
    resolver 172.19.0.190;
    set $folder_url https://folder.site.com:8888/;
    proxy_pass $folder_url;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_hide_header X-Frame-Options;
}

它可以很好地解析网站。它是一个 HTML 文件,可加载 CSS 和 JS 文件。我的问题是所有 3 个文件都具有完全相同的内容,即 HTML 内容。

我肯定忽略了某些愚蠢的事情,但我无论如何也想不通。

答案1

当在 proxy_pass 中使用变量时,如果指令中指定了 URI,则它会按原样传递给服务器,替换原始请求 URI。请参阅这个文件了解详情。

您已将 URI 指定/$folder_url变量,因此任何 URI(例如/folder/foo/在传递上游之前都会被转换为。

您的原始块将在向上游传递之前转换/folder/foo/foo

您可以使用正则表达式location块来捕获要向上游发送的 URI 部分,例如:

location ~ ^/folder/(.*)$ {
    resolver 172.19.0.190;
    set $folder_url https://folder.site.com:8888/$1;
    proxy_pass $folder_url;
    ...
}

请注意,正则表达式块的顺序location很重要。请参阅这个文件了解详情。

相关内容