游客发表
打开一个链接,网页屏幕上蹦出“404 Not Found”,显示这事儿谁都遇到过。何解上周我帮朋友看他的网页个人博客,首页正常,显示点进一篇旧文章就直接白屏加一行黑字。何解他急得不行,网页以为服务器炸了。显示其实404没那么可怕,何解它只是网页告诉你:这个地址上没东西。
先搞清楚404是显示谁返回的。多数情况下是何解服务器——你请求的URL路径在服务器上找不到对应文件或路由。但有时候,网页是显示中间某个环节出了问题。比如CDN缓存了一个已经不存在的何解页面,或者反向代理把请求转错了地方。我见过一个案例,网站迁到新服务器后,所有图片都404,原因只是Nginx配置里少了`root`指令的一个斜杠。
用浏览器开发者工具(F12)看Network面板。找到那个红色的请求,看状态码。如果确实是404,再看Response Headers里的`Server`字段,知道是谁在回应。这一步能帮你排除掉“假404”——有些网站故意返回404状态码但内容正常,那是SEO策略,不是故障。
接着手动测试。在服务器上`curl -I https://你的域名/那个路径`,看返回什么。如果curl返回200而浏览器404,大概率是浏览器缓存或Service Worker在捣乱。强制刷新(Ctrl+Shift+R)或者开无痕窗口再试。我遇到过Service Worker缓存了一个旧版路由表,导致新页面全部404,清除站点数据就恢复了。
Linux服务器区分大小写。`/About`和`/about`是两个不同的地址。Windows服务器不区分,所以本地测试正常,一上线就404。检查你的链接、路由配置、文件命名。WordPress用户经常因为固定链接设置改动,导致旧链接失效。去后台“设置-固定链接”重新保存一次,刷新重写规则,能救回不少。
静态站点更直接。GitHub Pages、Netlify这类平台,如果你删了某个HTML文件但没更新导航里的链接,点过去就是404。Netlify有个`_redirects`文件可以配规则,把旧路径301到新路径。很多人不知道这个,白白丢掉流量。
单页应用(React、Vue)部署后刷新404,这是经典问题。因为前端路由用History API,服务器不认识`/user/profile`这种路径,以为你要找物理文件。解决办法是配一条fallback规则,把所有未匹配的请求指向`index.html`。Nginx里加`try_files $uri $uri/ /index.html;`,Apache用`.htaccess`重写。我见过一个团队折腾一下午,最后发现是Nginx的`location /`块里漏了这行。
后端框架也有类似情况。Express要配`app.get('*', ...)`兜底,Django的`urls.py`最后加`re_path(r'^.*$', ...)`。别小看这个,用户手动输入地址或者从外部链接跳进来,没兜底就直接404。
文件明明在,但服务器说找不到。检查文件权限。Nginx或Apache的运行用户(通常是`www-data`或`nginx`)需要对文件有读权限,对所在目录有执行权限。`chmod 644`给文件,`chmod 755`给目录。权限不对,服务器返回403还是404取决于配置,但表现上都是“打不开”。
还有符号链接。如果你用`ln -s`指向了另一个目录的文件,但Nginx配置里`disable_symlinks`开了,也会404。这个坑比较隐蔽,日志里能看到“symbolic link not allowed”。
别猜。去看服务器错误日志。Nginx在`/var/log/nginx/error.log`,Apache在`/var/log/apache2/error.log`。里面会写清楚:哪个路径、什么原因、谁请求的。我帮人排查时,日志里一行`open() "/var/www/html/old-page" failed (2: No such file or directory)`,直接定位到问题——他删了旧文件但没做重定向。
404本身不是错误,它是HTTP协议的正常响应。真正要解决的是:用户为什么走到了一个不存在的地址,以及你希望他们看到什么。配一个友好的404页面,加上搜索框和返回首页的链接,比默认的服务器错误页强得多。如果旧链接有流量,做301重定向到新地址,别让用户撞墙。
下次再看到404,别急着重启服务器。打开开发者工具,看请求,查日志,改配置。十分钟能搞定的事,不用折腾一整天。
友情链接