https://midnight.pub/?via=https://susam.net/wander/,这个地址看起来只多了一小截尾巴。
但 Susam Pal 最后把这截尾巴删了。Wander Console 0.6.0 移除了曾在 0.4.0 加入的功能:用户通过这个网页随机探索工具访问外部页面时,自动给目标 URL 追加 via= 查询参数。作者公开承认这是一次设计失误,并在 commit b26d77c 中删除。
这件事规模不大。Wander Console 目前由 50 多个站点托管,推荐 1500 多个页面。可它碰到的问题很典型:工具为了让站长在访问日志里看出来源,能不能改写别人原本给出的 URL?
我的判断是,不该。
小功能为什么变成 URL 语义问题
Wander Console 是一个去中心化、自托管的网页随机探索工具。站长放置一个 HTML 文件和一个 JavaScript 文件,就能让访客随机跳转到社区推荐的个人网页。它可以跑在普通 Web 服务器上,也可以跑在 GitHub Pages、Codeberg Pages 这类静态托管服务上。
0.4.0 加入 via= 后,访问外部站点时会把来源写进目标 URL。好处很直接:被推荐网站的站长可以从访问日志里看出,这次访问可能来自 Wander Console。
问题也在这里。URL 不是便签。第三方工具把自己的信息写进别人的地址里,就已经越过了一条边界。
| 做法 | 实际效果 | 我的判断 |
|---|---|---|
Wander Console 0.4.0 自动追加 via= | 方便站长在日志中识别来源 | 便利建立在改写他人 URL 上 |
| Wander Console 0.6.0 删除该功能 | 回到原样访问目标地址 | 边界更清楚 |
使用 HTTP Referer | 由浏览器按策略发送来源 | 更符合 Web 现有机制 |
这里要把限制说清。原文不是在说所有 query string 都有问题。很多网站本来就用查询参数表达搜索、分页、筛选、资源版本。
有争议的是另一件事:目标站点没有定义这个参数,第三方工具却擅自追加。它想表达的是来源,改变的却是地址。
也不要把这件事理解成 Wander Console 在集中化追踪用户。原文重点是访问日志里的来源识别,不是平台收集用户数据。批评的对象,是改 URL 这个设计选择。
查询参数可能改变页面,不只是增加标记
作者举了 int10h.org 字体页面的例子。https://int10h.org/oldschool-pc-fonts/fontlist/ 可以打开,...?2 也可以打开,但 ...?foo 会返回 HTTP 404。原因是这个网站会把查询串解释为字体集合标识。
这件事提醒很朴素:改动 URL,就是创建一个新 URL。新地址可能还指向同一资源,也可能指向另一页,甚至直接不存在。
对个人站点和静态站点维护者,这不是抽象洁癖。很多站点没有复杂后端兜底。路由、缓存、重写规则、统计脚本都比较简单。一个多出来的查询串,可能带来 404、错误缓存、重复统计,或者让站长误判页面出了问题。
商业互联网里,UTM、联盟链接、分享追踪参数很常见。但那些场景通常有明确的商业归因目标,目标站点也往往预期会处理这类参数。Wander Console 的语境不同。它连接的是独立个人网站,推荐的是别人维护的 URL。
小社区工具更需要克制。站点之间靠互信,不靠默认替对方改地址。
对开发者来说,动作也很明确:
- 做短链接、RSS 阅读器、网页目录、分享按钮时,不要默认给外部 URL 加自家参数。
- 如果确实需要来源信息,先看浏览器和站点策略能不能通过标准头部解决。
- 如果必须改写链接,要把范围、开关、失败后果写清楚;但这仍不等于它就是好设计。
来源归因应交给 Referer 与 Referrer-Policy
Web 已经有来源归因机制:HTTP Referer 请求头,以及控制它的 Referrer-Policy。站点可以在服务器、文档或单个链接层面决定发送多少来源信息。浏览器、隐私设置和跨站策略也会影响最终结果。
这套机制不完美。它可能不发送完整来源,也可能被策略压缩成 origin,甚至不发送。但它的好处是边界清楚:来源信息由浏览器、用户设置和站点策略共同决定,而不是被某个工具硬塞进目标 URL。
| 场景 | 可能发生什么 | 对工具开发者的含义 |
|---|---|---|
| 默认浏览器策略 | 可能发送来源,跨站时通常更克制 | 不要假设一定能拿到完整路径 |
站点设置严格 Referrer-Policy | 来源可能被降级或不发送 | 尊重站点选择,不要用 query string 绕开 |
| 单个链接设置策略 | 可对具体跳转控制来源暴露 | 优先用标准属性和头部,而不是改 URL |
这也是 Susam Pal 最后没有保留 opt-in 的原因。即便用户可以选择开启,它仍然在做同一件事:把来源归因写进别人地址。加一个开关,只是降低默认伤害,并没有改变设计性质。
对最相关的两类人,影响可以落到动作上。
Web 工具开发者要检查自己的产品:有没有为了统计、推荐、分享、回流,把参数自动塞进外部链接。短期最该改的是默认行为。默认不改 URL,需要来源时用 Referer,再配合 Referrer-Policy 说明取舍。
个人站点和静态站点维护者则可以检查两件事:日志里是否出现大量陌生查询串;站点对未知 query string 是忽略、缓存、重定向,还是返回 404。若页面依赖查询串区分资源,最好把规则写得更明确,避免被外部工具误伤。
接下来真正要看的是同类工具会不会调整习惯。网页目录、随机跳转、阅读器、分享组件,都容易走向同一个省事方案:为统计方便改写链接。Wander Console 这次回退,给出的不是大新闻,而是一条小而硬的边界线。
链接之义,在于照原路抵达。工具可以记录自己的入口,但不该替别人改门牌。
