拦截过度导致功能失效:登录、视频、表单都不能用怎么办
典型症状和可能原因
| 症状 | 大概率原因 |
|---|---|
| Facebook / Google 登录按钮点不动 | EasyPrivacy / Fanboy 拦了 OAuth SDK 脚本 |
| 视频加载到一半卡住 | EasyList 里的分片规则误伤了正片请求 |
| 电商搜索不出结果 | 拦了搜索 API 的 fetch 请求 |
| 表单提交后无响应 | 拦了表单提交的 XHR 请求 |
| 网站导航菜单弹不出来 | 拦了菜单的 JS 脚本 |
定位步骤
第一步:临时关闭 ABP 确认是它
- ABP 图标 → 关掉当前域名的开关;
- 刷新页面,功能恢复了 → 确认是 ABP 的问题;
- 功能还是坏的 → 不是 ABP 的事,换方向排查。
第二步:在 Network 面板里找被拦的请求
- F12 打开开发者工具 → Network 面板;
- 勾选"Preserve log"(保留日志);
- 复现症状(点登录、提交表单等);
- 看 Network 列表里红色标记为 Blocked 的请求;
- 找到那个功能本来需要的请求(比如登录按钮点了应该发出一个
fetch请求,结果被 Blocked 了)。
第三步:判断该请求应该放还是该拦
看被拦请求的 URL:
- 如果域名是
doubleclick.net或明显是广告联盟域名 → ABP 拦得对; - 如果域名是
facebook.com或accounts.google.com→ 这是登录必需的,应该放行; - 如果域名是
api.example.com(目标网站自己的 API 域名)→ 可能是误伤,应该放行。
第四步:写例外规则放行
@@ ||accounts.google.com^$script
上面这条是放行 Google 登录的常用例外规则。具体怎么写看"自定义规则语法"章节。
写完规则后刷新页面再测,功能应该恢复。
为什么订阅列表会误伤
- EasyList 维护者不可能测试每一个网站的每一个功能;
- 某些网站的广告和功能走同一个域名(比如
example.com/api既给广告也给功能); - 网站改版后之前的规则可能不再准确(某个请求路径以前是广告现在是功能)。
误伤不是 ABP 的 bug,是订阅列表的固有局限。好的拦截器用户应该有写几条基础例外规则的能力。
反馈渠道
- EasyList 的误伤 → 去 EasyList 论坛提交(不是 ABP 官方论坛);
- 自定义规则导致的误伤 → 自己改;
- 如果是 ABP 引擎本身的 bug(比如某个正常的 HTML 文档被误判为广告)→ 去 ABP 官方论坛报告。