我们正在将请求代理到 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;