打开网页出现404
刷新了三次,打开那个页面还是网页白的。中间一行黑字:404 Not Found。出现我盯着它看了几秒,打开像是网页走错门,敲了半天,出现里头明明没人,打开门牌号却挂得端端正正。网页 这事几乎每天都会碰上。出现你点开一个收藏夹里存了半年的打开链接,或者从某个论坛的网页老帖里顺着爬过去,结果一头撞上这堵墙。出现404不是打开网络故障,它恰恰说明服务器是网页活的——它听见了你的请求,翻遍了目录,出现然后告诉你:你要的东西,不在这儿。 我头一回认真琢磨这个数字,是几年前整理旧博客。那会儿我把文章从一家平台搬到自建站,链接结构全变了。旧地址一个都没做重定向,全变成了404。有个读者发邮件来问,说三年前收藏的一篇教程打不开了,问是不是我删了。我没删。东西还在,只是换了地方。但对她来说,那个链接就是死了。 HTTP协议里,404属于“客户端错误”那一类。意思是,你请求的地址,服务器上找不到对应资源。跟403不一样——403是找到了但不让你看。跟410也不一样——410是明确告诉你,这东西曾经存在过,现在永久没了。404最含糊:它不承认也不否认,只是说“没有”。 很多人以为404页面是网站随便糊弄的。其实返回什么内容,服务器有得选。有些站点会给你一个搜索框,有些塞一堆推荐文章,还有些干脆放个迷你游戏。Google的404页面以前有只断线的机器人,后来换成了简笔画。这些设计都在做同一件事:别让用户扭头就走。 可大部分404页面没这么讲究。一行默认报错,白底黑字,连个回首页的链接都懒得放。你只能按后退键。这种体验像什么?像你去便利店买水,店员头也不抬说“没有”,然后继续刷手机。水确实没有,但你下次可能就不进这家店了。 我查过自己站点的访问日志。404最多的来源,是早年间从其他网站导过来的外链。那些网站有的改版了,有的关停了,有的把文章路径从 还有一种死法更隐蔽:大小写。服务器跑在Linux上, 最冤的是那种“看起来没死”的404。页面能打开,但内容是空的。比如某个API接口挂了,前端没做错误处理,直接渲染出一片空白。用户以为网卡了,其实是后端返回了404,只是被前端吞掉了。这种时候你连报错都看不见,只能靠开发者工具里的Network面板。 第一版是默认的Nginx报错页,丑得不行。第二版加了个搜索框和最新文章列表。第三版手写了一段话:“这个地址后面没有东西了,但你可以去首页看看。”第四版干脆放了一张我拍的旧铁轨照片,旁边两行小字:路到这里断了,换条道走。 改到第四版的时候我想通了一件事:404页面不是用来道歉的。用户点进来,已经知道出错了。他们要的是下一步去哪。给搜索框比给道歉有用,给几个热门链接比说“对不起”有用。甚至给一个“随便逛逛”的按钮,都比空白页强。 有数据说,用户遇到404之后,超过一半的人会直接关掉标签页。剩下的人里,大部分会手动改地址栏,试着把路径删掉一段。只有很少的人会去点你精心设计的404页面上的链接。但就是这很少的人,值得你把那个页面做得像样一点。 昨天我又看到一个404。是个独立博客的旧文章,作者已经不更新了,域名还在续费。页面标题写着“文章不存在”,底下有一行小字:“如果你是从搜索引擎来的,可以试试站内搜索。”我试了。搜到了。那篇文章换了个标题,还在。 链接会断,服务器会改,人会走。404只是网络在告诉你:这里曾经有过东西,或者从来没有过。你换条路走就是了。它其实是个状态码,不是一句骂人的话
链接会死,但死法各不相同
/archives/123换成了/posts/hello-world。链接一断,爬虫和用户就一起撞墙。About.html和about.html是两个完全不同的文件。你在Windows上写链接,顺手打了个大写,传上去就404。我因为这个毛病,丢过整整一个图片目录。后来学乖了,所有文件名强制小写,链接全部用相对路径。我自己的404页面改过四版