当使用 proxy_pass 中的变量时,从 NGINX 到 Cloudfront 系统的代理请求停止工作

当使用 proxy_pass 中的变量时,从 NGINX 到 Cloudfront 系统的代理请求停止工作

我们正在将请求代理到 NGINX 中的 AWS cloudfront 服务器,如下所示:

location /assets/ {
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $remote_addr;
    proxy_set_header        Host    upstream.example.com;
    proxy_pass      https://upstream.example.com/assets/;
    proxy_set_header        Authorization "Basic Zm9vOmJhcg==";
    proxy_ssl_server_name on;
}

如您所见,cloudfront 站点需要基本身份验证授权。我们注意到,这会缓存 DNS 条目upstream.example.com并更改现在使用的变量,从而导致重新解析。重新解析工作正常。

resolver 8.8.8.8 ipv6=off;

location /assets/ {
    set $backend_website upstream.example.com;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $remote_addr;
    proxy_set_header        Host    upstream.example.com;
    proxy_pass      https://$backend_website/assets/;
    proxy_set_header        Authorization "Basic Zm9vOmJhcg==";
    proxy_ssl_server_name on;
}

但现在实际请求不再正常工作:

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>***redacted***</RequestId>
<HostId>***redacted***</HostId>
</Error>

我假设 NGINX 现在必须发出不同的请求。但似乎只有涉及 NJS/Lua 的复杂方法才能记录完整请求。

有人知道那里发生了什么吗?如何调试?

编辑:我添加了proxy_cache off旧配置和新配置,以确保工作资产不会被缓存->但结果是一样的,新配置不起作用。

编辑2:

我正在尝试用这种方法来记录标题:

https://stackoverflow.com/a/55689741/288568

但它似乎记录了传入的标头,而不是我通过 proxy_set_header 设置的标头

答案1

看起来像是问题的重复: https://stackoverflow.com/questions/46230270/nginx-using-variable-in-proxy-pass-breaks-routing

我猜测它正在发送https://upstream.example.com/assets/assets/

当变量化时,尝试将 proxy_pass 设置为https://$backend_website$request_uri;

相关内容