Nginx中add_header指令在Internal内部重定向下的缓存表现

阿强大大_2460

阿强大大_2460

2026-04-06

569人浏览

原创

Nginx的add_header在internal重定向中不继承,仅对当前location生效;同名header默认覆盖而非叠加;需在终点location显式配置或加always参数确保生效。

nginx中add_header指令在internal内部重定向下的缓存表现

Nginx 的 add_header 指令在 internal 重定向(即 internal; location 或使用 rewrite ... last; / try_files 触发的内部跳转)中**不会自动继承或叠加**,其行为取决于 header 是否已在上游响应中存在,且受指令作用域和执行阶段影响。这不是“缓存表现”,而是 Nginx 响应头合并机制与请求处理流程共同决定的结果。

add_header 的作用域与执行时机

add_header 只在当前 location 的 响应发送阶段(post-read 阶段之后,filter 阶段) 生效,且仅对当前 location 生成的响应起作用。当发生 internal 重定向时:

  • 原 location 的 add_header 不会传递给目标 location;
  • 目标 location 若未显式配置 add_header,则不会添加对应 header;
  • 若多个 location 都设置了同名 header(如 add_header X-Foo "a"; 和 add_header X-Foo "b";),Nginx 默认只保留最后一个生效的值(非追加);
  • 该行为与 proxy_cache、fastcgi_cache 等缓存无关——即使响应被缓存,header 也是按上述规则在首次生成响应时确定的。

Internal 重定向中 header 的实际表现

以常见场景为例:

  • try_files $uri @fallback; → 进入 location @fallback { internal; add_header X-Source "backend"; }:最终响应包含 X-Source: backend,但主 location 中的 add_header 不生效;
  • rewrite ^/api/(.*)$ /backend/$1 break;(非 last):不触发 internal 重定向,仍在同一 location,原有 add_header 有效;
  • rewrite ^/api/(.*)$ /backend/$1 last;:触发 internal 跳转到 location /backend/,此时只有该 location 的 add_header 生效;
  • 若后端(如 FastCGI 或 proxy)本身返回了 X-Frame-Options,而 location 中又用 add_header X-Frame-Options "DENY",Nginx 默认不会覆盖**已存在的 header(除非启用 always 参数)。

如何确保 header 在 internal 流程中可靠出现

关键方法是统一在最终处理 location 中声明,或使用 always 显式控制覆盖逻辑:

  • 在所有可能作为终点的 internal location 中,重复写明所需 add_header;
  • 对必须强制设置的 header(如安全头),加上 always 参数:add_header X-Content-Type-Options "nosniff" always;,使其在 2xx/3xx/4xx/5xx 响应中均生效;
  • 避免依赖“继承”,Nginx 无 header 继承机制;
  • 调试时可用 curl -I 或查看 access_log 中 $sent_http_* 变量验证实际发出的 header。

与缓存相关的常见误解澄清

有人观察到“加了 add_header 后缓存失效”或“header 没进缓存”,其实本质是:

  • proxy_cache_key 默认不含 response header,所以 header 变化本身不影响缓存命中;
  • 但若 header 设置导致后端响应内容变化(例如通过 add_header 触发不同业务逻辑——这不属于 Nginx 行为),才间接影响缓存;
  • 真正影响缓存的是 Cache-Control、Expires、Vary 等由后端或 Nginx 显式设置的响应头,而非任意 add_header;
  • 如果用 expires 或 add_header Cache-Control 控制缓存,需确保它们写在最终 location 中,否则不生效。
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

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

下载

相关标签:

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

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

423

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

4107

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

6985

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

601

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1516

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3998

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

557

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

179

12

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习