功能开关让页面在同一个 URL 下呈现不同内容时,版本状态不能只记“开/关”,而要记录开关状态、生效范围、渲染结果和抓取证据四层信息。如果只记开关名,回查时无法区分“开关已关但缓存未失效”和“开关从未生效”;如果只截页面,又无法解释同一页面为何在不同地区或不同用户代理下不同。正确做法是:先判断这个开关是按环境生效还是按请求生效,再决定记录粒度。
按环境生效指开关在部署层决定,例如预发和线上各有一套配置,同一时间全站只有一种页面形态。这种情况下,版本状态的最小记录单位是“环境 + 部署版本 + 开关快照”,抓取到的页面通常稳定可复现。
按请求生效指开关根据 cookie、查询参数、用户代理或灰度分组动态返回不同 HTML。此时同一 URL 对搜索引擎和普通用户可能返回不同内容,版本记录必须绑定请求条件,否则你记录的“当前版本”只是某一个分组的版本。
判断依据可以看三点:开关配置是否随构建产物一起发布;同一 URL 连续请求是否返回相同 HTML;清除 cookie 后是否变化。若第二点不成立,就按请求生效处理。
不论哪种条件,建议每次开关变更时执行以下动作,并保留结果:
这里有一个容易遗漏的动作:抓取时固定用户代理和语言头。如果两次抓取用了不同 UA,页面差异可能来自 UA 判断而非开关本身,后续对比就失去意义。做完这一步,如果发现同一开关状态下 HTML 仍不稳定,说明还存在第二层动态逻辑,需要继续拆分,而不是直接判定开关失效。
功能开关常按主机名或路径配置。二级域名可能承载独立应用、独立缓存层或独立部署流水线,因此同一个开关在主域名和二级域名下的生效时间、生效范围可能不一致。记录时不写清主机名,回查时就会出现“明明关了却还能看到旧内容”的误判。
具体做法是:在版本记录中把完整主机名写进字段,例如 shop.example.com 与 www.example.com 分开两行,各自附抓取时间和开关值。若两者返回不同,先确认是不是缓存或 CDN 节点差异,再确认开关配置是否只推送到其中一个环境。
抓取量下降、页面暂时不被抓取或某次抓取返回旧版本,都不能单独证明开关处理正确或错误。常见合理解释包括:抓取预算临时调整、缓存过期时间未到、CDN 节点未同步、请求被限流。要区分这些原因,至少需要两个时间点的抓取证据,并确认两次请求条件一致。
另外,用 robots.txt 限制抓取不等于页面会从索引中移除;提交站点地图也不保证收录。若开关导致页面需要临时隐藏,应优先考虑页面级 noindex 或内容替换,并分别核查不同搜索引擎的支持情况,而不是依赖单一手段。
假设例子:某页面开关控制价格显示,关闭后应显示“暂不可售”。你在关闭后抓取到旧价格,于是判断开关未生效。但若第二次抓取换用了不同 UA,而该 UA 命中了缓存规则,则差异可能来自缓存而非开关。此时应固定 UA 重抓,若仍返回旧价格,再检查缓存键是否包含开关状态。这个动作会直接决定下一步是改开关配置还是清缓存。
最终记录应能回答四个问题:什么时间、什么主机名、什么请求条件、返回了什么。满足这四点,即使开关后续被删除或改名,也能凭快照复现当时的页面状态。若缺少请求条件,快照只能说明“某一次看到了什么”,无法支撑判断,下一步的修复方向也会随之变得不可靠。