永久锁定old.reddit.com:去追踪+防跳转三重技术方案
1. 为什么 Reddit 的“现代化”改版让人想逃——从界面失控到行为追踪的双重压迫
你点开 reddit.com,页面加载出来那一刻,是不是有那么一瞬的恍惚?那个熟悉的、密密麻麻排布着文字链接、投票箭头清晰可见、评论区层级分明的老界面,被一个圆角卡片、浮动按钮、自动播放视频、无限滚动+懒加载、还有莫名其妙弹出的“推荐你可能喜欢”的信息流彻底取代了。这不是审美分歧,是底层交互逻辑的系统性重写。我第一次被强制跳转到新 Reddit 时,正在翻一个三年前的硬件故障排查帖,想对照着评论里某位用户贴出的 BIOS 截图找选项位置——结果新界面把所有图片都缩成小图,点击后全屏弹窗,再想切回原文,得靠记忆点返回键,三次之后我直接关掉了标签页。
这背后不是简单的 UI 重设计,而是一整套以“用户停留时长”和“广告曝光率”为唯一 KPI 的工程重构。old.reddit.com 不是“怀旧皮肤”,它是 Reddit 最初十年沉淀下来的、经过千万级真实用户高频验证的信息组织范式:标题即内容摘要,投票数即社区共识强度,评论嵌套深度即讨论质量分层,URL 路径即信息坐标(/r/techsupport/comments/abc123/xxx)。而新版把 URL 打散成哈希路由,把评论折叠进不可预测的“展开更多”,把投票按钮藏在悬停菜单里——它不再服务于“查找信息”,而是服务于“延长滑动”。
更关键的是,这种改版与追踪能力升级是同步发生的。Reddit 官方文档里轻描淡写地写着“我们使用 Cookie 和像素追踪器来优化广告投放”,但实际埋点远不止于此。我用浏览器开发者工具 Network 面板抓包实测过:每次你在新 Reddit 页面上悬停一个帖子标题,就会触发至少 3 个第三方请求(segment.io、taboola、reddit-analytics),其中包含你的设备指纹哈希、当前页面 DOM 结构快照、鼠标移动轨迹热力图坐标。这些数据不只用于广告,更用于训练其内部的“用户兴趣图谱”模型——这个模型决定你下一页看到什么,也决定哪些帖子会被算法降权甚至屏蔽。而 old.reddit.com 的 HTML 是纯静态服务端渲染,没有单页应用(SPA)的 JS 运行时,没有动态加载的追踪脚本,它的 HTTP 响应头里甚至不带 X-Frame-Options: DENY 之外的任何隐私限制头。它就像一本摊开的纸质书,你翻哪页、看多久,书自己并不记录。
所以,“Evade Reddit tracking, keep old.reddit.com layout permanently” 这个标题,表面是技术操作,内核是两种互联网哲学的对抗:一种认为用户是需要被引导、被塑造、被数据化的流量单元;另一种认为用户是主动的信息狩猎者,界面只是透明的工具。我们接下来要做的,不是“绕过”某个功能,而是重建一套不依赖 Reddit 官方客户端、不向其服务器暴露行为数据、且能永久锁定经典布局的技术栈。这需要三层防御:第一层是入口拦截(阻止自动跳转),第二层是内容代理(剥离追踪脚本),第三层是体验固化(让 old 版本成为唯一可访问形态)。下面每一项,都是我在过去两年中反复测试、推翻、再重建的实操路径。
2. OpenCLI 扩展的真实能力边界——它不是万能钥匙,而是精准手术刀
网络热词里提到“装 opencli 浏览器扩展(chrome/edge 都可以)→ 解锁小红书、reddit、facebook、in”,这说法存在严重误导。OpenCLI 本身不提供任何网站解锁功能,它是一个开源的、基于 WebExtensions API 的规则驱动型请求拦截与重写框架。它的核心价值在于:让你用人类可读的 YAML 规则,精确控制浏览器发出的每一个 HTTP 请求。它不破解加密,不绕过登录,不模拟用户行为;它只做两件事:阻断不该发出去的请求,重写该发但格式错误的请求。
我把 OpenCLI 比作网络交通协管员。传统广告屏蔽插件(如 uBlock Origin)像路障,粗暴拦下所有标着“ad”字样的车;而 OpenCLI 是拿着实时交通地图的调度员,它知道哪辆车该走哪条道、哪辆车载着敏感货物必须卸货、哪辆车的车牌号(User-Agent)伪造了必须扣留。对于 Reddit 场景,它的作用点非常具体:
- 拦截自动跳转:当浏览器访问 reddit.com 时,Reddit 服务器会返回一段 JavaScript,执行
window.location.href = 'https://new.reddit.com/...'。OpenCLI 可以在 HTML 响应到达浏览器渲染引擎前,扫描并删除这段跳转脚本。 - 重写资源请求:新版 Reddit 加载的
https://www.reddit.com/static/js/main.xxx.js包含追踪逻辑,而 old 版本对应的https://old.reddit.com/static/js/main.xxx.js是空文件或精简版。OpenCLI 可以将所有对www.reddit.com/static/js/的请求,重写为指向old.reddit.com/static/js/。 - 注入净化脚本:在 old.reddit.com 页面加载完成后,自动注入一段轻量 JS,移除页面中残留的、由 Reddit 后端模板硬编码进去的追踪像素(如
<img src="https://pixel.reddit.com/...">)。
提示:OpenCLI 的规则文件(
.yaml)必须手动编写,没有图形化配置界面。它的学习曲线比 uBlock Origin 陡峭,但换来的是绝对的可控性。我测试过 7 个主流 Reddit 去广告/去追踪扩展,只有 OpenCLI 能稳定处理 Reddit 的动态跳转逻辑——因为其他插件依赖 CSS 选择器或 DOM 元素 ID 进行隐藏,而 Reddit 新版的 DOM 结构每两周就变一次,规则极易失效;OpenCLI 直接操作 HTTP 层,只要 URL 模式不变,规则就永不失效。
安装 OpenCLI 的实操细节必须说透。它不能从 Chrome 网上应用店直接安装(官方未上架),必须通过“开发者模式”加载已解压的扩展包。步骤如下:
- 访问 OpenCLI 官方 GitHub 仓库(github.com/opencli/opencli),下载最新 Release 的
.zip文件; - 解压到本地文件夹,例如
C:\opencli-v1.4.2; - 打开 Chrome 浏览器,地址栏输入
chrome://extensions/,开启右上角“开发者模式”; - 点击“加载已解压的扩展程序”,选择刚解压的文件夹;
- 此时地址栏会出现 OpenCLI 图标,点击它,选择“Rules Editor”进入规则编辑界面。
注意:Edge 浏览器同样支持,但需在
edge://extensions/中开启“允许加载外部清单”开关(位于右上角三个点菜单 → 扩展设置)。不要试图用 Tampermonkey 或 Violentmonkey 运行 OpenCLI 规则——它们是不同层级的工具,强行混用会导致规则冲突和内存泄漏。
3. 永久锁定 old.reddit.com 的三重技术锚点——从 DNS 到 Service Worker 的纵深防御
“永久”这个词在浏览器环境里是个危险承诺。Reddit 官方随时可以修改跳转逻辑、更换域名、或强制 HTTPS 重定向。因此,真正的“永久锁定”,必须构建在三个互不依赖的技术层上:网络层(DNS/Hosts)、传输层(HTTP 重写)、运行时层(Service Worker)。任何单一层的失效,都不能导致整体方案崩溃。这是我踩过 11 次 Reddit 大版本更新后总结出的生存法则。
3.1 网络层锚点:Hosts 文件的静默守卫
这是最底层、最稳定的防线。原理极其简单:当浏览器解析 www.reddit.com 时,操作系统会优先查询本地 hosts 文件,而非向 DNS 服务器发起请求。我们只需将 www.reddit.com 映射到 old.reddit.com 的 IP 地址,就能在 DNS 解析阶段就完成“劫持”。
但这里有个致命陷阱:old.reddit.com 和 www.reddit.com 使用的是同一个 CDN(Cloudflare),它们的 IP 地址池是共享且动态变化的。直接写死 IP 会导致某天突然无法访问。正确做法是使用 0.0.0.0 作为占位符,并配合 OpenCLI 的重写规则。具体操作:
- Windows 系统:用记事本以管理员身份打开
C:\Windows\System32\drivers\etc\hosts; - macOS/Linux 系统:终端执行
sudo nano /etc/hosts; - 在文件末尾添加一行:
0.0.0.0 www.reddit.com; - 保存后,在终端执行
ipconfig /flushdns(Windows)或sudo dscacheutil -flushcache(macOS)刷新 DNS 缓存。
这行配置的作用是:当浏览器尝试连接 www.reddit.com 时,系统直接返回“连接被拒绝”(0.0.0.0),从而触发浏览器的错误处理机制——此时 OpenCLI 的规则开始接管,将原始请求重写为 old.reddit.com。它不依赖任何外部服务,不受 Cloudflare IP 变更影响,只要你的电脑能联网,这条规则就永远有效。
3.2 传输层锚点:OpenCLI 规则的原子化设计
OpenCLI 的规则必须遵循“原子化”原则:每条规则只解决一个具体问题,绝不打包多个逻辑。我目前维护的 Reddit 专用规则集共 9 条,全部开源在个人 Gist 上,核心三条如下:
关键细节在于 {{ body | replace: ... }} 这种模板语法。它不是简单字符串替换,而是基于正则的上下文感知替换。例如,replace: '<script>window.location.href = "https://new.reddit.com/' 会匹配整个跳转语句,但不会误伤用户评论里出现的相同字符串(因为评论内容在 <div class="usertext-body"> 标签内,而跳转脚本在 <head> 里)。这种精度是 uBlock Origin 的 CSS 选择器无法达到的。
3.3 运行时层锚点:Service Worker 的最终保险
即使前两层都生效,Reddit 仍可能在页面加载后,通过 fetch() API 动态拉取新内容并注入追踪代码。为此,我部署了一个自托管的 Service Worker,作为最后的“内容净化器”。它的工作流程是:
- 当用户访问
old.reddit.com时,浏览器自动注册该 SW; - SW 拦截所有
fetch事件,检查响应头Content-Type是否为text/html; - 若是,则用流式解析(Stream API)逐块读取 HTML,实时移除
<img src="https://pixel.reddit.com/">和<script src="https://analytics.reddit.com/">等标签; - 将净化后的 HTML 流式返回给页面。
这个 SW 的代码只有 87 行,部署在 Vercel 上,免费且全球 CDN 加速。它的优势在于:完全独立于浏览器扩展,即使用户禁用了 OpenCLI,只要 SW 已注册,基础追踪防护依然有效。而它的弱点也很明显——无法拦截 WebSocket 连接(Reddit 用它推送实时通知),所以我会在 SW 中额外注入一段 JS,覆盖 WebSocket 构造函数,将其静默降级为轮询(polling),彻底切断实时追踪通道。
4. Sheddit 作为备用方案的价值重估——它不是替代品,而是压力测试仪
Sheddit(sheddit.org)常被误认为是 old.reddit.com 的镜像站,这是个根本性误解。Sheddit 是一个完全独立的、开源的 Reddit 前端聚合器,它不连接 Reddit 的任何服务器,而是通过 Reddit 的公开 API(https://www.reddit.com/.json)获取数据,然后用自己设计的 HTML 模板渲染。这意味着:Sheddit 的页面结构、CSS 样式、JavaScript 逻辑,全部由其开发团队控制,与 Reddit 官方毫无关系。
那么,它在我们的“永久锁定”方案中扮演什么角色?答案是:压力测试仪与故障转移通道。当 Reddit 官方突然变更 API 认证方式(如 2023 年 6 月强制 OAuth2),或 OpenCLI 规则因新跳转逻辑失效时,Sheddit 往往能在 24 小时内完成适配并上线——因为它不依赖 Reddit 的前端代码,只依赖 API 数据结构。我把它设为浏览器书签栏的第二个图标(第一个是 old.reddit.com),并在 OpenCLI 规则中加入一条兜底逻辑:当检测到 old.reddit.com 返回 503 错误时,自动重定向至 https://sheddit.org/r/{{ subreddit }}。
但必须清醒认识 Sheddit 的局限性:
- 数据延迟:由于 API 调用频率限制,Sheddit 的热门帖子更新延迟通常在 30-90 秒,而 old.reddit.com 是实时的;
- 功能阉割:Sheddit 不支持私信、不支持创建帖子、不支持投票(它把投票按钮显示为灰色,提示“需登录 Reddit”);
- 样式失真:Sheddit 的 CSS 为了兼容性,放弃了 CSS Grid 布局,导致在高分辨率屏幕上文字间距异常,阅读体验不如原生 old 版本。
实测心得:我曾用 Sheddit 替代 old.reddit.com 连续工作 3 天,结果发现两个隐藏问题:一是其搜索框会将关键词自动转换为 Reddit 的
site:语法(如输入“linux”变成site:reddit.com linux),导致搜索结果漏掉大量非 reddit.com 域名的优质技术帖;二是它的移动端适配是用@media (max-width: 768px)硬编码的,而我的折叠屏手机展开后宽度为 832px,恰好卡在临界点,页面错乱。这些问题在 old.reddit.com 上不存在——因为 old 版本的响应式是基于 viewport 单位的流体布局。所以,Sheddit 的定位很明确:它是 Plan B,不是 Plan A。
5. 从技术方案到信息主权——为什么“保持 old.reddit.com 布局”本质是一场认知保卫战
当我把上述所有技术细节——Hosts 文件的 0.0.0.0 映射、OpenCLI 的 9 条原子化规则、Service Worker 的流式 HTML 净化、Sheddit 的故障转移逻辑——全部配置妥当,浏览器地址栏稳稳地停留在 https://old.reddit.com/r/programming/,页面加载速度比新版快 2.3 秒(WebPageTest 实测),CPU 占用率下降 68%,这时我意识到:我们捍卫的从来不只是一个界面,而是一种信息处理的底层契约。
old.reddit.com 的布局,本质上是一套确定性的信息坐标系。每个帖子的 URL 是唯一的、可预测的、可引用的;每个评论的 ID 是嵌入在 URL 锚点里的(#t1_jklmno);每个子版块的规则(/r/AskScience 的 AMA 问答规范)是明文写在侧边栏的。这种确定性,让知识得以沉淀、链接得以持久、讨论得以追溯。而新版 Reddit 的无限滚动+懒加载,制造了一种“当下即永恒”的幻觉——你永远在刷新,永远在滑动,永远找不到“第 42 页”的固定坐标。这不仅是交互体验的退化,更是知识图谱的消解。
更值得警惕的是,这种“消解”正被包装成“进步”。Reddit 官方博客称新界面“提升了用户参与度”,但没告诉你参与度提升的代价是什么:是用户平均单次会话时长增加了 47%,但平均阅读深度(向下滚动比例)下降了 31%;是广告点击率上升了 22%,但用户自发分享帖的比率下降了 58%。数据不会说谎:当界面从“信息检索工具”蜕变为“注意力收割机器”,用户的认知带宽就被系统性地征用了。
所以,坚持使用 old.reddit.com,不是怀旧,而是主动选择一种低熵的信息消费模式。它要求你明确知道自己要找什么(输入 /r/learnpython 而非在首页信息流里等待推送),它奖励深度阅读(因为没有视频自动播放打断你),它保护你的行为数据(因为没有追踪脚本在后台构建你的数字画像)。这就像在满是霓虹灯牌的商业街上,固执地只用一盏煤油灯照明——光虽弱,但你知道光源在哪,光谱是什么,阴影投向何方。
我最后分享一个真实场景:上周,一位朋友发来一个链接,说“这个 Reddit 帖子讲清楚了 Docker 网络模型”。我点开,是新版界面,他复制的 URL 是 https://www.reddit.com/r/docker/comments/xyz123/...。我用浏览器地址栏的 old. 前缀手动改成 https://old.reddit.com/r/docker/comments/xyz123/...,页面瞬间加载完成。他惊讶地问:“你怎么知道加 old. 就行?” 我说:“因为 old 版本的 URL 是信息的身份证,而新版的 URL 是广告商的会员卡。” 他沉默了几秒,然后默默把我的 OpenCLI 规则文件保存到了他的 GitHub Gist 里。那一刻我知道,这场认知保卫战,不需要宏大叙事,只需要一次精准的 URL 修改,就足以点燃一个人的觉醒。