昨天下午三点二十分,我在书房把 MacBook Air 接上电源,打开 Chrome,习惯性地点了地址栏右侧那颗时钟图标,想找回上午读到一半的一篇关于敦煌契约文书的论文。结果「最近访问」列表里前二十条中有七条是同一个页面的变体,URL 的尾缀分别挂着 ?from=timeline、?spm=a1z0e 和一个我完全不认识的 &ref=qq。我盯着那个多出来的 & 号看了大概十秒钟,然后做了一件平时不太会做的事:把它当成一个小课题来做。我先在地址栏输入 chrome://history 导出全部记录,再打开终端,用 sqlite3 直接读 ~/Library/Application Support/Google/Chrome/Default/History,把 urls 和 visits 两张表 join 出来。第一条发现很朴素:Chrome 的访问计数是挂在 URL 上的,标题变化不产生新条目,但查询参数一改就成了一个新 URL——所以「最近浏览的网站」在我这里其实被拆成了 47 条重复,而我的记忆里它们只是一个页面。

为了有个对照组,我切到 Safari,打开「历史记录」菜单里的「显示全部历史记录」,同一个上午的时间窗口里,Safari 把同一个域名的不同查询参数折叠在了一起,只保留最后一条,并且把标题做了截断处理。我拿秒表样的东西核了一下:Chrome 那个多出来的 &ref=qq 条目时间戳是 2026-05-26 10:41:07.882,而它的父页面记录是 10:41:07.611,差了 271 毫秒——也就是说,用户点开一个外链后浏览器自己追加的跟踪参数,被当成了一次独立的「浏览」。这件事让我想起之前在写 隐私空间入口qq浏览器 那篇稿子时踩过的坑:同样是参数污染,隐私空间对查询参数的剥离策略比普通窗口激进得多,导致你在隐私窗口里访问过的页面,回到普通窗口的最近列表里根本认不出来。我当时的判断是「可以接受」,现在我要收回一半。

接着我做了三组手动测试,每组重复五次。第一组:同一个页面在普通窗口打开,再在隐私窗口打开,观察最近列表里的条目数;第二组:从微信内置浏览器点开一个链接,再选择「在浏览器中打开」,看会不会生成两条记录;第三组:故意在输入到一半时按 Esc,看是否留下半截 URL。第一组结果最稳定,普通窗口一条、隐私窗口零条,符合预期。第二组的结果让我有点不舒服:五次里有四次出现了两条记录,URL 完全相同,时间相差不到一秒,标题一个来自微信的重定向页、一个来自目标页。第三组则出现了两次「半截 URL 残留」,形如 https://arxiv.org/abs/2505,点进去是 404。我把这些截图整理进一个叫 history-audit-0526 的文件夹,一共 19 张,命名规则是「浏览器-测试组-第几次」。

说实话,我认为浏览器厂商在「最近浏览」这个功能上集体偷了懒。这话可能有人不同意,但我还是想说:把一个按毫秒时间戳排序的原始访问流直接端给用户,本质上不是「帮你找回刚才看的东西」,而是「把你自己的行为日志原样倒给你」。用户需要的是一次语义上的归并——同一篇文章的多个入口应该合并,一次跳转产生的重定向链应该折叠,隐私会话里的痕迹应该被明确标注而不是彻底隐身。Safari 做对了一部分,Chrome 只做了 URL 去重的最浅层,Edge 稍微好一点、会把「来自其他应用的打开」单独归类,但三家都没有给出「这是同一个阅读行为」的判断。我在 新奥门494949.cm的记录 这篇旧文里谈过类似的观点:工具的价值不在于记录得多,而在于记录的边界是否被人理解。

中途我停下来泡了第二杯茶,顺便打开 qq浏览器在线打开网页网页 做了个交叉验证,因为那台安卓备用机上的历史记录和这台 Mac 是两套逻辑。安卓端的 QQ 浏览器把「最近关闭」和「最近浏览」分成了两个面板,前者按会话、后者按时间,这个切分其实比桌面端更贴近人的回忆方式——人回忆的常常是「我刚才关掉的那个」,而不是「我十点四十一分零七秒看的那个」。我在便签上写下一句话:「最近」这个词天然是模糊的,产品把它当成了精确时间轴,这是语义错位。后来这句话被我改写进了这篇稿子的标题备注里。

顺带说一个具体的人。我师弟周衍,做前端,上周跟我抱怨他调试一个本地项目时,Chrome 的最近列表里塞满了 localhost:5173 的各种路由,一屏刷不完。他的处理办法是每次调试前先清一次历史,但这样又会把真正想留的记录一起清掉。我建议他试试把开发用的 profile 单开一个,Chrome 的「个人资料」切换器可以在两套历史之间跳,代价是要多记一个头像位置。他试了两天,回我一句「行是行,就是切换的时候老点错」。这个反馈很真实:所有关于「整理」的方案,成本最终都落在肌肉记忆上。我也把这个细节记进了 49.49图库app 那篇的技术备注,因为那篇讲的也是同一类问题——入口太多,用户靠手速而不是靠逻辑在找东西。

还有一个细节值得单说:Safari 在显示历史记录时,会把页面标题按字数截断到大约 60 个字符,超出部分用省略号。我的那篇论文标题有 71 个字符,被截成了「敦煌契约文书中的保人责任再考——以……」,后半截「BD09625 号残卷为中心」消失了。这意味着当我凭「最近浏览」去找它时,看到的是一个不完整的语义单元,我得点进去才知道是不是我要的那篇。Chrome 相反,标题完整但条目重复。两家各修了一半,谁也没修到点上。我把这个对比写进了给编辑的邮件里,标题叫《「最近」不是时间轴》,邮件正文 512 字,发出去的时间是下午五点零九分。

写到这里我得承认,这个题目最初只是我想找一篇论文顺手记两笔,结果越挖越深。如果你也在用「打开浏览器最近浏览的网站」这个功能,我的建议很具体:先去 chrome://history/syncedTabs 看看有没有跨设备串进来的记录,再把查询参数做个手动筛,最后如果你用隐私窗口,别指望它真的「不留痕」——它留的是另一种痕,只是你看不到。我在 新奥门49499浏览器打开 和 qq浏览器无法打开文档 两篇里分别写过参数污染和文档预览失败的案例,今天这篇算是它们的上游:不是打不开,是打开了之后,记录系统没跟上。至于我最早要找的那篇敦煌论文,最后是在收藏夹里翻到的——你看,绕了一大圈,最可靠的还是那个我手动存下来的书签。