安全响应头加了但有些响应里没有,状态码条件和层级继承怎么查

📅 2026-10-12 👁️ 0

为什么加了安全响应头,有些响应里却没有带上?多数情况不是没生效,而是这两件事之一:那个响应的状态码不在加头指令的生效范围内,或者定义被写在另一个配置层级里、上层整组没有继承下来。排查要按缺头的那个具体响应去复现,而不是按正常页面检查。

先确认缺头的是哪一类响应

最常见的报告是「首页检查全绿,报错页面却缺头」。原因在文档里写得很明确:加头指令只在响应码等于 200、201、204、206、301、302、303、304、307 或 308 时才把字段加进响应。四百段与五百段的返回不在这张表里,包括常见的禁止访问、内部错误,以及静态资源找不到时的返回。也就是说,检查工具打在正常页面上的通过结论,代表不了异常路径。

生效条件怎么绕过

同一份文档给出解法:加 always 参数,此时不论响应码为何都会添加该字段。这个参数从 1.7.5 版本起提供。取舍要讲清楚——带 always 会让所有返回都带上这组头,包括那些由错误页或调试入口生成的响应,好处是覆盖完整,代价是一旦某条头写错,影响面也覆盖到全部响应。安全类头通常希望无例外生效,因此这个参数在多数场景值得用。

现象 大概率原因 怎么验证 常见改法
正常页面有、错误页没有 状态码不在生效列表 手工请求一个不存在的地址看响应 加 always 参数
上层写了、某个子块里全部消失 同层定义了加头指令,上层整组不继承 逐层比对配置里该指令出现的位置 在子块重写整组,或用继承参数
本地复现全有、线上一部分没有 前置缓存或压缩层改写了响应 绕过缓存带随机参数请求 在生成该响应的那一层补
跳转响应里缺头 三百段中只有列表内的码生效 请求一个已知会跳转的旧地址 把跳转改成内部重写,或在目标页补

层级继承是最容易踩的一条

文档里的这条规则值得逐字读:这些指令当且仅当当前层级没有定义任何加头指令时,才从上一层级继承。它不是合并,而是整组替换。典型事故是:在站点主配置写好一组安全头,后来在某个子路径块里为了加一条缓存相关的头写了一行加头指令,结果上层那一整组在这个子路径下全部消失。检查时不要只问「这个子块写了什么」,要问「这一层有没有写过」——只要写过一次,上层就整组失效。较新的版本提供了重定义继承规则的指令,名为 add_header_inherit,出现在 1.29.3 版本,可以让下层在上层定义的基础上追加而不是替换。

定位是哪一层生成的

响应头缺失的另一个来源是:这个响应根本不是站点程序返回的。反向代理、缓存层、负载均衡在站点之前就能独立产出返回,比如缓存命中的响应、代理超时产生的错误页。区分办法是看响应里带没带程序自己会写的那些字段,再绕过前置层直接请求站点服务端口复现一次。AnQiCMS 默认监听 8001 端口,部署时通常由前置服务器反代到它,两边都各自有配置层的响应头设置,逐层对比比整体重启更快找到差异。

上线后的复核动作

改完之后建议按四条路径各取一次响应:正常页面、跳转地址、不存在的地址、需要鉴权的入口。这四条覆盖了生效列表内与外的两类状态码,也覆盖了继承规则会被触发的位置。把每次响应的头字段记下来对比,比在检查网站上重复跑一次分数的信息量大得多——检查站点通常只测首页。

常见问题

问:只在首页检查通过,可以认为配置没问题吗? 答:不能。首页是二百段成功响应,正好落在生效列表里,异常路径的表现看不到。

问:子配置里只写一条头,为什么会带走一组头? 答:因为同层一旦定义了加头指令,上层定义就不再继承,替换是整组发生的。

问:改了配置为什么线上仍然缺头? 答:先确认这个响应是不是由缓存或代理层直接返回,那一层的配置需要单独补。

相关文章

把搜索和训练拆成两个开关之后,放行规则按哪个用途判

2026 年 9 月 15 日的一份边缘平台公告把搜索、AI 训练、AI 智能体拆成三项独立控制,站方不必再在保留搜索和挡住训练之间二选一。公告同时给出两个占比:混合用途爬虫占已验证抓取流量的 36.6%,站点侧不到百分之一会挡搜索爬虫、约百分之十七限制 AI 训练。开关拆开之后,放行规则要按访问用途判,而不是按来源域名判。

2026-10-12

有测量说抓取脚本只挑一部分排除规则遵守,比例差在哪

一项覆盖三十六个机构站点、四十天流量、约一百三十个自报身份抓取脚本的测量显示,遵守率按指令类型差别很大:抓取频率类指令约 60.9%,精确路径禁止约 31%,整段禁止约 30.7%;而且不到四成的脚本会在一百六十八小时内重新读取排除文件。这组数字说明只靠排除文件这一层手段并不成立,站内还要有防采集与权限层。

2026-10-12

Robots 文件本身读不到的时候,抓取方按什么规则继续

排除协议原文把读取失败分成两种相反结果:响应状态码落在五百段到五百九十九这段服务端错误时,抓取方必须视为全部禁止;落在四百段到四百九十九这段客户端错误时,抓取方可以访问服务器上任意资源。协议还写明这些规则不是访问授权,也不能替代内容安全措施,站内的后台与用户组权限才是真正的一道门。

2026-10-12

给大模型的站点说明文件是给人读的还是给智能体用的,提案改过说法

这类站点说明文件按提案的现行说法是帮智能体使用网站,早期表述才是帮语言模型读懂网页,服务对象从模型扩展到智能体。文件是纯文本清单,规范要求里只有一项必填:带项目或站点名称的一级标题,其余摘要段、说明段和按二级标题分组的文件清单都是可选。AnQiCMS 支持自动生成站点 llms.txt,并与站点地图分工不同。

2026-10-12

首屏资源提前加载的中间响应码,为什么多数情况只在多路复用协议下发

用于首屏资源提前加载的 103 中间响应,是服务器还在组织最终页面时先发出的提示,客户端可以提前预连接或预加载资源。官方文档建议出于兼容与安全考虑只在 HTTP 协议 2 或更高版本上发送,多数浏览器也只在这个条件下支持。原因是旧协议下中间响应与最终响应之间的边界处理不一致,容易和等待中的响应内容混淆。

2026-10-12

前端监控里跨域图片的加载耗时全是零,该补哪个响应头

跨域图片的加载耗时在前端监控里读成零,缺的是计时放行响应头。官方文档的定义是:该头指定哪些来源被允许看到通过资源计时接口取到的属性值,否则这些值会因跨域限制被报告为零。取值可以是一个星号放开全部来源,也可以是逗号分隔的来源清单。它只影响计时读数,不改变资源的访问权限,所以补这个头解决的是归因问题,不是访问问题。

2026-10-12

页面被别的站点嵌进去时,登录凭据按顶层站点分区是怎么回事

带分区属性的登录凭据会按顶层站点分开存储:同一个地址直接被访问时读到一份,被别的站点嵌进页面时读到另一份,两者不共享。官方文档写明该属性表示凭据应使用分区存储,并且设置它就必须同时设置安全标记,还建议用带主机名前缀的名字把凭据绑定到主机而非可注册域。站点若假定登录态全局共享,嵌入场景下就会读不到。

2026-10-12

程序保存设置时把站点配置文件整份重写,为什么会盖掉自己加的规则

程序保存设置时重写目录级配置文件,会把手工加的规则一起带走,因为这类文件只有一份、由程序按自己的模板整份生成。同行程序 PbootCMS 在 V3.2.26 更新记录里就修过这一问题:Apache 开启伪静态时误判环境导致每次保存都覆盖站点目录下的 Apache 配置文件。划分办法是把程序管理的规则与运维追加的规则分成两处维护,改前备份、改后逐条比对。

2026-10-12