一张 2019 年的表单,和一次无法复现的跳转
上个月十七号下午,我在 tk49免费打开 的旧归档里翻一份 2019 年 11 月 3 日的跳转清单,纸是我自己打印的,A4、双面、左上角用订书钉钉过两次,第二次钉歪了,所以第一页有一道斜着的压痕。清单第三行写着「表单入口:form-1103」,后面跟了一串当时看起来完全正常的路径参数。我照着敲进地址栏,回车,页面没有跳转,只留下一片灰白的空白和一个转了三秒就停住的加载环。我以为是浏览器缓存的问题,清了一遍历史记录和 cookie,重启,再敲一次,还是一样的结果。后来我才从归档的日志评论里看到,那个表单在 2020 年 6 月 12 日被下线过,评论里写得很短:「form-1103 已合并,保留跳转」。可实际发生的事情是——跳转根本没保留,只是把一个地址从页面上删掉了,别的什么都没做。
这件事让我整个下午都不太舒服。我把清单上剩下的二十多行逐条核对,发现至少有 七处 指向了同样的状态:路径还在服务器上,协议头返回 200,但页面正文是空的,标题是默认的「Untitled」,连一个提示语都没有。我去论坛上找当时负责维护的人,一个叫 陈砚 的账号最后一次登录是 2021 年 4 月,个人签名里留着一句「入口问题请发邮件」,邮箱却是一个已经被注销的企业域名。我又去查了另一份 2022 年的公开说明,里面把这种空页面解释成「为兼容旧链接保留的占位」,但占位这两个字本身就很可疑——占位是给谁占的?一个返回 200 却什么都不显示的页面,对用户来说跟直接报错有什么区别,无非是把责任从服务器推给了人的耐心。我在这里写这些,不是要追责某个具体的人,而是想说,入口这个地方最容易被当成一件做完了就不用管的事,实际上它是整条链路里最容易腐烂的一段。
说到这里就得提一句前阵子看到的 免费的网页版入口,那篇东西里对入口的讨论至少还讲到了协议层和一个可复现的检查流程,虽然我未必全同意它的结论,但它的态度是对的:把入口当成一项需要持续维护的对象,而不是一次性交付的按钮。相比之下,我这次在 tk49免费打开 里看到的很多旧页面,连「什么时候该检查」这个问题都没有被提出过。再往前翻,我还看到有人把入口问题归到浏览器头上,讨论帖里有人提到用 qq浏览器网站打开 时表现不一样,我按帖子里的步骤复现了一遍,换了两个内核版本,结果一致:问题不在浏览器,在服务端返回的内容本身。顺带说,像 49码图库资料中心 这类偏资料整理型的页面,反而因为要频繁核对来源,把链接有效性做成了页面的一部分,这种笨办法比任何自动化监控都可靠。
我的个人观点放在这里,允许有争议:一个入口页面如果做不到「失效时明确告诉用户失效」,那它还不如干脆返回 404。 我知道这句话会被做产品的人反驳,说什么用户体验要平滑、要减少挫败感、要给用户留一条出路。可你想想,用户在空页面前反复刷新、反复清缓存、反复换网络,最后怀疑的是自己的设备,这种隐性的挫败感比一句「该入口已下线」要重得多。我在核查清单上第七行那条路径时,前后试了大概 十五分钟,中间还去查了是不是自己记错了大小写,结果什么都没有,只是一个 200 的空响应。这十五分钟没有任何人为此负责,也没有任何机制会记录它。入口的可靠性不是靠「能打开」三个字撑起来的,是靠「打不开的时候怎么办」这个问题的答案撑起来的,而大部分入口的答案,是沉默。
最让我愤怒的不是技术问题,是那天下午四点二十几分的一次对话。我把截图发给一位还在维护相关页面的朋友,问他这种返回 200 的空页面有没有计划处理,他回我一句:「这个不重要吧,反正用户也不会一条条点。」我盯着这句话看了半分钟,回了一个「嗯」,然后关掉了对话框。他说的也许在统计上是对的,日活里可能真没有多少人会去点第三行那个 2019 年的表单入口,但「用户不会点」和「点了什么都没有」是两件事,前者是概率,后者是承诺。既然把地址印在了清单上,就等同于承诺这个地址有一天会被访问,那么它被访问时至少该说一句话。我写这篇东西,就是想把这个下午的十五分钟和那句「反正用户也不会点」记下来,免得过两年连我自己都觉得那只是一个普通的灰色下午。
顺带记一下这次的核查方法,不算什么高明的流程,只是因为不想再重蹈覆辙:先把清单上的每一条路径按日期分组,优先处理三个月内被引用过的;然后逐条抓取响应头与正文长度,正文长度为零而状态码为 200 的一律标黄;最后对每一条标黄的路径写一句人话说明,比如「本页入口已于某年某月合并,请改走主路径」,写不出说明的就标红。这套办法笨,但至少不会让下一个坐在屏幕前的人,把十五分钟花在怀疑自己的键盘上。入口这件事,说到底就是用一个又一个具体的句子,去堵住那些本来会变成沉默的缝隙。