如何在Nginx镜像块中获取上游响应的Location请求头?
Nginx镜像转发上游Location响应头的原生解决方案
核心问题:默认情况下mirror指令会在请求发往上游之前就触发镜像请求,这时候上游的响应头还没返回,$upstream_http_location自然是空值,镜像服务器也就收不到你要的头。
原生配置修复方案
改成用post_action延迟镜像请求到上游响应返回后执行,同时缓存上游的Location头:
# 把上游返回的Location头缓存到变量里 map $upstream_http_location $dav_response { default $upstream_http_location; } location /ops/opendata/DataAccessViewer/ { proxy_pass https://<upstream>/; proxy_redirect https://<upstream>/ /; # 等上游响应返回后再触发镜像请求 post_action /davmirror; } location /davmirror { internal; # post_action触发时请求体已经被处理过,不需要再发往镜像服务器 proxy_pass_request_body off; proxy_set_header Content-Length ""; # 保留你原来能正常工作的头 proxy_set_header DAV-Original-URI $request_uri; proxy_set_header DAV-tier internals; # 传递缓存好的上游Location头 proxy_set_header DAV-response $dav_response; proxy_pass https://<mirror>; }
关键说明
map指令用来缓存上游的Location头,避免变量在不同请求阶段丢失值post_action是Nginx原生指令,会在当前请求处理完成(已收到上游响应并返回给客户端)后,触发内部的镜像请求,这时候$upstream_http_location已经有有效取值- 加上
proxy_pass_request_body off是因为原始请求体已经被上游消费,再发送空请求体给镜像服务器符合当前场景需求;若需保留请求体,可额外结合proxy_store或请求体变量缓存方案
验证步骤
- 用
curl -I直接请求上游服务器,确认确实返回了Location响应头 - 查看镜像服务器的访问日志,检查
DAV-response头是否携带了正确的Location值
内容的提问来源于stack exchange,提问作者Shaunak
相关产品推荐
相关产品推荐

