一个野生站长的笔记
生命不息,折腾不止!

Nginx 纯代码优化:404 页面优雅 301 跳转首页

折折腾网站的兄弟们肯定都遇到过一个头疼的问题:网站改版、调整伪静态规则、或者删掉几篇旧文章后,会产生大量的 404 死链。

如果放任不管,用户点进来看见个冷冰冰的 404 报错直接就关了,不仅流量白白流失,还会被搜索引擎降权。最常见的做法,是把这些 404 页面统统重定向到首页。

但很多人在网上随便搜个教程,直接在 Nginx 里无脑加一句: error_page 404 =301 /;

千万别这么干!这是一个极其恶心的坑。

为什么?因为如果你是一个以图文为主的网站(或者像我一样自建了图床),别人很可能在外站引用了你的图片。如果某天你把这张图删了,触发了 404,上面这句“无脑跳转”规则就会把你的整个网站首页的 HTML 代码当成图片返回给对方的浏览器!

这会导致两个致命后果:

  1. 别人的网页前台会报出一堆诡异的跨域或加载错误。
  2. 你自己的服务器带宽会被瞬间榨干——人家只是请求一张 50KB 的缩略图,你的服务器却拼命给人家塞几十上百 KB 的首页完整代码,遇到高并发直接卡死。

今天分享一段我一直在用的极简 Nginx 纯代码规则。核心思路是“动静分离”:只对普通页面做 301 跳转,对图片、CSS 等静态资源老老实实返回 404。

核心 Nginx 规则代码

直接上代码,干净利落:

# 拦截 404 错误并交给自定义的 location 处理
 error_page 404 = @redirect_to_home;
location @redirect_to_home {
# 核心拦截逻辑:如果是静态资源触发了 404,老老实实返回 404 状态码
# 彻底杜绝失效图片强行加载首页导致带宽爆炸
if ($uri ~* \.(jpg|jpeg|png|gif|webp|svg|ico|css|js)$) {
return 404;
}
# 除上述静态资源外的所有普通页面死链,统统 301 永久重定向到首页
 return 301 $scheme://$http_host/;
 }

部署方法(以宝塔面板为例)

如果你用的是宝塔面板,操作的时候千万别乱删,宝塔有它自己的脾气:

  1. 进入 【网站】 列表,点击你的域名,打开 【配置文件】

  2. 往下滑,找到大概在第 17 行左右,带有 #error_page 404/404.html; 的代码行。

  3. 避坑: 千万不要删除或者修改这一行!宝塔面板底层是靠这行注释做定位锚点的,删了以后面板的 SSL 和 404 设置就错乱了。

  4. 我们只需要把光标放到这一行末尾的分号后面,敲一个回车另起一行。

  5. 然后把我上面提供的那段 404 拦截代码,原封不动地粘贴在它的下面,点击保存即可。

纯 Nginx 底层转发,不经过 PHP 引擎处理,哪怕一天有一万个死链请求,也不会消耗你 CPU 一丝一毫的算力。而且用了 301 状态码,能明确告诉搜索引擎爬虫把旧链接的权重转移给首页,一滴流量都不浪费。

赞(4)
未经允许不得转载:me235 » Nginx 纯代码优化:404 页面优雅 301 跳转首页

评论 抢沙发

评论前必须登录!

 

登录

找回密码

注册