sub_filter可动态下线缓存网页功能入口,通过精准匹配完整HTML片段、关闭once限制、适配响应类型、绕过压缩与缓存干扰,并按环境条件启用,全程无需改后端、不重启、不清缓存。

用 sub_filter 动态下线缓存网页中的特定功能入口,核心是“精准定位 + 安全移除 + 避免缓存干扰”,整个过程无需修改后端代码、不重启服务、也不清空整站缓存。
锁定目标入口的 HTML 片段
先确认要下线的功能在页面中如何呈现。常见形式有:
- 一个带 class 的按钮:
<button class="feature-ai-chat">AI 聊天</button> - 一段导航菜单项:
<li><a href="/ai">智能助手</a></li> - 一个独立区块容器:
<div id="promo-banner">…</div>
替换目标必须是完整、可闭合的 HTML 片段(含起始和结束标签),避免只删开头导致 DOM 结构错乱。推荐用闭合标签对作为匹配锚点,例如用 <div id="promo-banner">...</div> 整体替换为空字符串。
配置 sub_filter 实现静默移除
在对应 location 块中添加如下指令:
- 关闭单次限制:
sub_filter_once off;(确保所有同类入口都被处理) - 显式声明响应类型:
sub_filter_types text/html application/xhtml+xml;(默认不处理 xhtml) - 执行删除操作:
sub_filter '<div id="promo-banner">...</div>' '';(注意:省略号需替换成实际内容或使用更健壮的写法) - 若内容含换行或空格不确定,改用宽松匹配:
sub_filter '<div id="promo-banner">' '<div id="promo-banner" style="display:none;">';,仅隐藏而非删除,更安全<h3>绕过缓存与压缩带来的干扰</h3> <p>被缓存的 HTML 若已压缩或分块传输,<code>sub_filter会失效。关键处理项:- 禁用响应压缩:
gzip off;或在 proxy_pass 前加proxy_set_header Accept-Encoding ""; - 屏蔽 ETag 和 Last-Modified:
etag off;+proxy_hide_header Last-Modified;,防止客户端复用旧缓存 - 强制短时效缓存:
add_header Cache-Control "public, max-age=60";(让下线效果 1 分钟内生效)
按环境/路径条件性启用下线逻辑
避免误伤测试或预发环境。可用
map或if控制:- 用 map 定义开关:
map $host $should_disable_ai { default 0; "~*prod\.example\.com" 1; } - 在 location 中包裹逻辑:
if ($should_disable_ai) { sub_filter '<button class="feature-ai-chat">' '<!-- AI chat disabled -->'; }</button> - 或针对特定路径单独配置:
location /dashboard/ { ... },不影响其他页面
不复杂但容易忽略。
- 禁用响应压缩:

















