如何记录自定义变量记录后端返回的特定响应头 $upstream_http_...

秋静姑娘_4965

秋静姑娘_4965

2026-05-24

1034人浏览

原创

Nginx中需用map指令在http块中将$upstream_http_*变量映射为自定义变量才能记录响应头,因$upstream_http_*仅在proxy_pass成功后有效且不可直接用于log_format。

如何记录自定义变量记录后端返回的特定响应头 $upstream_http_...

在 Nginx 中,可以通过 $upstream_http_* 变量获取上游(后端)响应头的内容,但要“记录”这些值(比如写入 access log 或传递给其他模块),需先用 map 或 set(配合第三方模块)将其提取为可记录的自定义变量。

使用 map 指令提取响应头为自定义变量

map 是最标准、无需额外模块的方式,适用于将上游响应头映射为可在日志、proxy_set_header 等上下文中使用的变量。

  • 必须在 http 块中定义,不能放在 server 或 location 内
  • 源变量只能是 Nginx 内建变量(如 $upstream_http_x_request_id),不能是运行时动态生成的变量
  • 目标变量名建议用下划线分隔,避免与内置变量冲突

示例:提取后端返回的 X-Request-ID 和 X-RateLimit-Remaining

Livestream Script Generator
Livestream Script Generator

直播带货脚本:话术、节奏、互动、促单。适用于主播、电商运营、MCN机构。

下载
http {
    map $upstream_http_x_request_id $log_request_id {
        default $upstream_http_x_request_id;
        ""      "-";  # 若响应头不存在或为空,记为 "-"
    }
<pre class="brush:php;toolbar:false;">map $upstream_http_x_ratelimit_remaining $log_rate_limit_remaining {
    default $upstream_http_x_ratelimit_remaining;
    ""      "-";
}

log_format main '$remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent" '
                 'rid="$log_request_id" rl="$log_rate_limit_remaining"';

access_log /var/log/nginx/access.log main;

}

在 location 中通过 proxy_pass 触发 upstream_http_ 变量

$upstream_http_* 变量仅在成功代理到 upstream 后才有效。若请求未进入 upstream(如被 rewrite、return 或内部跳转中断),对应变量为空字符串。

  • 确保 location 使用了 proxy_pass,且后端实际返回了目标响应头
  • 响应头名称自动转为小写并用下划线替代连字符(如 X-Request-ID → $upstream_http_x_request_id)
  • 若后端返回多个同名响应头,Nginx 默认只取第一个(遵循 RFC,不支持多值合并)

注意事项与常见问题

直接在 log_format 中使用 $upstream_http_* 不可靠 —— 因为日志格式在请求开始时解析,而 upstream 响应头在响应返回后才可用。必须通过 map 提前声明依赖关系,让 Nginx 知道该变量需延迟求值。

  • 变量名拼写必须完全匹配转换规则:X-Custom-Header → $upstream_http_x_custom_header
  • 如果后端响应头含空格或特殊字符,Nginx 会原样保留,但日志中可能影响解析(建议后端规范输出)
  • 若需修改或添加响应头再透传,用 proxy_hide_header / add_header 配合,不影响 $upstream_http_* 的原始值

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

stream

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2843

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7130

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6666

10

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.09

3883

4

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

2023.11.14

954

3

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2024.03.12

6746

8

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.16

5530

6

Go 语言 HTTP 编程与中间件开发教程合集
Go 语言 HTTP 编程与中间件开发教程合集

全面讲解 Go 语言 HTTP 编程的核心知识,涵盖 net/http 标准库的 Server/Handler/HandlerFunc 体系、DefaultServeMux 路由注册与自定义路由器、Request / ResponseWriter 请求响应处理、中间件(Middleware)链式设计模式与常见中间件(日志/CORS/认证/限流)开发、http.Client 的超时配置与连接池管理、Cookie / Session 处理、

2026.05.08

581

31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
零基础精通 PS 视频教程
零基础精通 PS 视频教程

共268课时 | 120.5万人学习

前端工程师必备技能—PS切图
前端工程师必备技能—PS切图

共11课时 | 2.2万人学习

麦子学院Photoshop切片视频教程
麦子学院Photoshop切片视频教程

共13课时 | 4.3万人学习