datasette #3046:不要向 Firefox 的 HTML 页面提供 link: rel=next HTTP 头

2026-11-08

我今天在看 Firefox 网络面板时,注意到对 Datasette 表格页面的请求正在触发对该表下一页行的 HTTP 预取。

发生这种情况是因为 Datasette 页面会提供这样的 HTTP link 头:link: <https://latest.datasette.io/fixtures/compound_three_primary_keys?_next=a%2Cd%2Cv>; rel="next"

这很糟糕。访问这些页面的人中有一小部分会点击“下一页”链接,这意味着他们的浏览器正在获取不必要的数据,而 Datasette 服务器不得不渲染一个随后被丢弃的完整页面。

我深入查了一下,了解到 Firefox 有一个关于此行为、已经开放 24 年的 issue……那个 issue 的一条早期评论链接到了我 2002 年抱怨这个功能的博客文章。我不只是忘了自己写过这件事,我完全忘了这个功能!

Simon Willison 发现 Datasette 表格页返回的 Link rel=next 响应头会触发 Firefox 预取下一页,造成无谓请求和服务端整页渲染;他追溯到 Firefox 一个已开放 24 年的 issue,并发现自己 2002 年就写过文章抱怨该功能。

这是什么信号:这不是单纯的浏览器怪癖,而是 HTTP 头语义、浏览器预取策略与服务端默认行为之间的错配。Datasette 表格页用 Link rel=next 表达分页语义,但 Firefox 会把该头用于预取下一页;原文观察到的是 HTML 表格页触发了对下一页行的 HTTP 预取。

为什么重要:原文指出,只有一小部分访客会点击“下一页”,但浏览器仍可能提前取下一页,导致无谓数据传输,并让 Datasette 服务器渲染一个随后被丢弃的完整页面。成本不由点击率单独决定,而由页面访问量、预取策略和服务端渲染开销共同决定;对分页数据工具来说,这是容易被默认响应头掩盖的隐性成本。

对谁有价值:Datasette 维护者、Web 框架与数据浏览工具开发者、实现分页 API 或表格页的团队,以及关注服务端性能和 HTTP 头设计的人。原文还显示该 Firefox 行为可追溯到 24 年前的 issue,作者本人也忘了 2002 年写过相关抱怨,说明这类浏览器兼容性怪癖很容易被团队忽略。

可以怎么行动:在输出 Link rel=next 前判断请求是否来自 Firefox 且响应为 HTML 页面;保留页面内“下一页”链接,不依赖 HTTP Link 头完成导航;在集成测试中断言特定 UA 下不输出该头;用 Firefox 网络面板复现并观察预取;跟进 Firefox issue,并在框架层提供可配置开关,避免一刀切删除所有 rel=next。

风险或限制:User-Agent 检测天然脆弱,不同 Firefox 版本行为可能变化;删除 Link 头可能影响依赖该头做分页发现的其他客户端;rel=next 对分页语义仍有价值,需区分 HTML 页面、非 HTML 响应和不同浏览器。原文未给出具体流量比例或性能数字,是否值得改应由实际访问量和渲染成本测量决定。

这条内容的真正价值,不只是“有人发布了一个新功能”,而是它揭示了 simonwillison.net 背后的产品方向、工作流变化或竞争信号。对 OPC 来说,这种信息可以转化成持续追踪的栏目选题。

如果把《datasette #3046:不要向 Firefox 的 HTML 页面提供 link: rel=next HTTP 头》放到你的内容系统里,它最大的价值在于帮助读者更快看懂“为什么值得关注”,而不是只看到一条碎片化动态。