本地 Web 服务器详解 —— 为什么被拦域名返回空页面而不是连接拒绝
连接拒绝 vs 空响应:为什么有区别
没有本地 Web 服务器时
AdAway hosts 拦截把广告域名重定向到 127.0.0.1。但手机的 127.0.0.1 上什么都没监听,所以 TCP 连接请求立刻被拒绝(Connection Refused)。
某些 APP 处理连接拒绝时行为正常(广告位空着),但也有 APP 处理不好:
- Android 原生浏览器的后退按钮:页面里加载了广告,你按后退时浏览器内部逻辑会卡住,因为广告请求连接拒绝后某个内部状态没有正确清理
- 某些游戏:收到连接拒绝后直接崩溃退出,而不是继续运行
- 某些 WebView 内嵌页面:显示"连接被拒绝"的错误页面而不是正常内容
有本地 Web 服务器时
AdAway 启动一个极小的 HTTP 服务器监听 127.0.0.1。被拦截的广告请求会收到:
HTTP/1.1 204 No Content
Content-Length: 0
空响应。APP 拿到 HTTP 204 后知道"这个请求成功了但没有内容",处理流程是正常的——只是广告位没东西。
性能开销
极小。根据 AdAway 社区测试:
- 内存:+1~2 MB
- CPU:几乎为 0(只有被拦截的请求过来才响应,而且只是回一个空包)
- 电池:无区别
完全可以开着不关。
开本地 Web 服务器的步骤
- 主菜单 → 偏好设置
- 找到 Local Web Server(本地 Web 服务器)
- 打开开关
- AdAway 会在通知栏显示"本地 Web 服务器已启动"
关闭同理——关掉开关即可。
验证本地 Web 服务器是否在运行
开着后你可以:
- 浏览器访问任何一个被 AdAway 拦截的广告域名(比如
doubleclick.net) - 如果本地 Web 服务器在运行,你会看到一个空白页面或极小的"页面不可用"消息
- 如果没运行,浏览器会显示"无法访问此网站 / 连接被拒绝"
和 hosts 拦截的关系
本地 Web 服务器不替代 hosts 拦截——它只是 hosts 拦截的"响应者"。整个拦截链路是:
APP 请求广告域名
→ hosts 文件返回 127.0.0.1
→ 无本地 Web 服务器:连接被拒绝 → 某些 APP 行为异常
→ 有本地 Web 服务器:连接成功,收到 HTTP 204 → APP 正常,广告不显示
hosts 文件负责"把域名指向本地",本地 Web 服务器负责"本地有东西在监听、返回正常响应"。两者配合。
某些 APP 需要"特定 HTTP 状态码"才能正常运行
更极端的情况:某些 APP 的逻辑是"HTTP 204 也不行,必须 HTTP 404 才算这个域名请求无效"。这种极少数场景下,AdAway 的本地 Web 服务器不够灵活(它总是返回 204)。你可以用其他更定制化的解决方案,但这种情况非常罕见——开本地 Web 服务器解决了 99% 的兼容性问题。
总结
开着,没理由关。
内存可忽略,解决了若干 APP 兼容性问题,零副作用。