You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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或请求体变量缓存方案

验证步骤

  1. 用curl -I直接请求上游服务器,确认确实返回了Location响应头
  2. 查看镜像服务器的访问日志,检查DAV-response头是否携带了正确的Location值

内容的提问来源于stack exchange,提问作者Shaunak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:52:10