我有一个简单的代理,需要auth_request
子请求进行身份验证。经过身份验证的用户随后被代理到 s3 url 来下载文件。
然而我看到的是,每次用户访问代理 URL 时,身份验证子请求似乎都会触发多次。
我不确定这是为什么,我的一个理论是,s3 下载很大,需要下载多个数据包,每个数据包都需要一个单独的身份验证子请求?但这听起来不对,我假设单个身份验证子请求适用于整个会话的生命周期。
我知道身份验证子请求会触发多次,因为我在子请求代码中添加了日志记录功能,该功能可显示每个请求的重复条目。
有人有关于此事的更多信息吗?
下面是我的 nginx 配置(无论有没有该auth_request_set
指令都会发生这种情况)
location ~* ^/(assets/.*) {
auth_request /auth-proxy;
resolver 8.8.8.8;
proxy_pass_request_headers off;
proxy_pass_request_body off;
proxy_redirect off;
auth_request_set $token $upstream_http_token;
client_max_body_size 5120M;
proxy_pass https://bucket-name.s3.amazonaws.com/$1?$token;
}
答案1
问题不在于每个单个请求都发出多个子请求,而在于代理的 S3 服务器响应 206 Partial Content 响应,导致客户端发出后续请求来获取其余内容(需要通过新的子请求正确地重新验证)。
由于 Firebug 在网络日志中将 206 个部分内容链压缩为单个 200,因此没有更早地发现这个问题,所以我没有立即意识到这个问题在幕后发生,直到我注意到当用户代理是 wget 时 S3 不会发出 206 个响应!