存量旧文怎么清理:保留、合并、重定向与删除

五年前的旧文该不该删:老文章清理的四种处置

站点跑了几年之后,后台会积累一批「自己都不想再看第二眼」的文章:装环境时写的三行笔记、某个已经倒闭的服务商的开通教程、标题里带「最新」「2021版」的过时对比。这些页面的数量往往超过真正有价值的内容,而且它们持续消耗着抓取预算、拉低整站的平均质量信号。

但直接删掉是错的。这篇文章讲的是怎么把这堆存量内容分成四类,分别用保留更新、合并、重定向、删除四种方式处置,以及删除前后的技术细节。这套流程我在自己的站上跑过两轮,第一轮删了 137 篇,直接后果是两周内自然流量掉了三分之一;第二轮按下面的方法做,删了 60 篇,流量没波动,反而有几个老页面的排名回升了。两次的差别就在「分类」这一步。

先别急着删:哪些旧文其实在赚钱

判断一篇文章该不该留,不能靠「我觉得它写得烂」。要看数据,而且要看对的数据。打开 Search Console 的「效果」报告,按页面导出最近 16 个月的表格,至少包含这四个字段:页面 URL、点击次数、展示次数、平均排名。

然后按这个逻辑分类:

有点击的(点击 > 0,最近 90 天)。不管内容多过时,它都在带来真实流量。/2021/nginx-install.html 这种文章往往还有几百次点击,因为搜索「nginx 安装」的人不关心年份。这类不能删,要更新。

有展示没点击的(展示 > 100,点击 = 0,平均排名 5~20)。这是最值得投入的一类。搜索引擎认为它相关,但用户看了标题不点——说明标题和摘要没有吸引力,或者排名在第二页。改标题、补摘要、把内容补厚一点,往往能带来明显收益。我在一个工具站的「图片压缩怎么用」页面上做过这件事,改标题加了一句具体收益描述,点击从 0 涨到每月 300 多。

有展示但排名很差(平均排名 > 30)。这一类要看有没有同类主题的强页面。如果有,就合并过去;如果没有,说明这个方向你在这个站上做不起来,考虑删除或改写。

零展示零点击。这才是有资格进入「删除」候选的池子。但零展示也可能是「新页面还在沙盒期」或者「从来没被收录」,要先用 site: 查一次,或者用 GSC 的「网址检查」看看状态。

顺手说一个坑:Search Console 导出的表格有行数上限(单次 1000 行)。页面多的站要按日期分段导出,或者在 URL 后面加分页参数。另外「平均排名」字段在低展示量页面上极不稳定,展示 5 次的页面排名 1.2 没有意义,别被它骗了。

四类处置:保留更新、合并、重定向、删除

把上面的数据和一个主观判断(内容是否还有效)交叉起来,落到四个动作上:

第一类,保留并更新。有点击、内容主体仍然有效,只是细节过时。比如「Typecho 安装教程」,虽然版本号变了,但流程没变。做法是更新正文,同时在页面顶部加一句更新说明和日期,正文里补一节「2026 年补充」。不要改 URL,不要改发布时间的「年-月」部分(如果有),只改内容。改完之后在 GSC 里对这几个 URL 手动请求编入索引,等它重新抓取。

第二类,合并。同一主题写了三篇,每篇都在讲一部分。这是最常见的存量问题——写文章的人当时没想到会重复。合并的做法是:选出其中流量最好、URL 最干净的那篇作为主页面,把另外几篇里独有的有效段落搬进去,然后给被合并的页面做 301 到主页面。

合并时注意两件事:一是搬段落时保持内部链接指向新的锚点,别留下失效锚点;二是如果被合并的页面有外部链接(别的站引用过它),301 能传递大部分权重,但如果你直接把页面删了,那些外链就变成死链,白白浪费。

第三类,重定向。页面已经没价值,但 URL 有历史或者外链。所有删除动作都应该伴随 301 到相关的现有页面,而不是 404。为什么不是 410?410 的意思是「永久消失,别再来了」,它确实比 404 更明确,会更快地从索引里移除。但如果那个页面原来有排名和外链,301 到相关页面还能把权重接过来,410 就是彻底丢掉。

我第一轮的错误就在这里:137 篇直接返回 404。那些页面的外链全部变成死链,等于主动放弃了一批链接资产。

第四类,删除。内容无效、没有外链、没有排名、也没有相关页面可以重定向。这类占比通常不到 20%。真正的删除不是 rm 文件,而是:数据库里把状态改成隐藏(Typecho 的 status = 'hidden' 或者 WordPress 的 trash),URL 返回 410 或者 301 到首页/分类页。保留数据库里的记录,是为了万一哪天要恢复。

URL 已经进索引了怎么办

删除之后页面不会立刻从搜索结果里消失,这是很多人放弃清理的原因——「删了一堆,site: 数量一点没变」。正常情况下,搜索引擎需要 1 到 4 周重新抓取这些 URL 并看到 301/410,然后才从索引里移除。这中间有几件事可以加速:

1. 确保返回的状态码真的对。用 curl -I 检查,不要相信浏览器缓存。很多站点的伪静态规则会把不存在的路径 try_files 到 index.php,然后框架返回 200 加一个「页面不存在」的页面——搜索爬虫看到的是 200,就永远不会删除。这是最常见的失败原因:

curl -sI "https://www.example.com/2021/old-post.html" | head -1

必须看到 301 或 410。如果看到 200,说明你的 try_files 兜底写错了,抓到的永远是首页内容,这就是典型的「软 404」,比不删更糟。

2. 更新 sitemap。把已删除的 URL 从 sitemap.xml 里去掉,并在 GSC 里重新提交。如果站点的 sitemap 是自动生成的(大多数 CMS 都是),这一步是自动的,但要确认生成器真的读到了新状态——有些缓存插件会把 sitemap 缓存几小时。

3. 清理内链。删除的页面如果还被别的文章链接着,那些链接会变成死链。用站内搜索 grep -r "old-post.html" /var/www/html/ 或者整站爬一遍找出来,改成指向新页面。这一步不做的话,用户点到死链会直接离开,体验和权重都受损。

4. 分批做,不要一次删几百篇。这是我最想强调的一条。一次删除大量页面会让站点的整体结构短期内剧烈变化,搜索引擎会把它理解为「这个站在大规模清空内容」,从而降低抓取频率。稳妥的节奏是每周删 10~20 个 URL,观察二到四周的流量曲线再继续。

那些「该留但不该保留原样」的内容

除了上面四类,还有两类特殊页面值得单独说:

标签页和归档页。很多 CMS 会自动生成 /tag/xxx/ 和 /2021/03/ 这类页面。标签页如果每个标签只有一篇文章,就是典型的质量稀释——几十个只有一条内容的页面会占掉大量抓取预算。处理方式是给只有 1~2 篇文章的标签加 noindex,或者干脆关掉标签归档(Typecho 可以在主题里改,WordPress 可以用 noindex 插件)。归档页同理,只保留年归档,去掉月归档。

搜索页和分页。/?s=关键词 这类搜索页被大量索引是常见问题。它们不是垃圾内容,但对搜索用户毫无价值,还产生大量重复。给搜索页加 noindex, follow,同时检查 robots.txt 里有没有限制(注意别用 Disallow 挡爬虫,那样爬虫看不到 noindex,反而更糟)。列表分页的 page/2/ 之后不需要 noindex,但要确保 canonical 指向自己而不是第一页。

删除之后:三件必须验证的事

做完一轮清理,不要就这么算了。三件事必须验证:

一是抽查状态码。随机抽 20 个被处理的 URL,curl -I 看状态码,301 的要跟到最终落地页(curl -sIL,跟到 200 为止),确认没有重定向链(A → B → C 这种两跳以上会被浪费权重),也确认没有形成循环。

二是看 GSC 的「网页」报告。过两周回来看「已抓取 - 尚未编入索引」「已排除」这几个分类的数量变化。正常情况下「404/410」分类会增加(这是好事),但如果「重复网页」「已发现 - 尚未编入索引」大量增加,说明 301 配置有问题。

三是记一张表。把每个被删的 URL、删除日期、301 目标、原因记下来(CSV 或者数据库一张小表都行)。半年后你一定会想「那篇文章我记得写过」,这时候表能救你。我用一张 redirects 表同时承担两件事:记录历史,以及给 Nginx 生成跳转规则。

用 Nginx 批量管重定向

如果 CMS 本身不方便做 301(比如静态站、或者老 URL 结构已经不在系统里),最省事的办法是用 Nginx 的 map 指令集中管理。把 URL 和目标的对应关系放在一个单独的 map 文件里,改的时候只动一个文件:

# /etc/nginx/redirect.map
/2021/nginx-install.html   /tech/nginx-install/;
/2021/old-compare.html     /tech/cdn-compare/;
/2020/xxx.html             410;

# nginx.conf 的 http 段
map $uri $redirect_target {
    default                "";
    include               /etc/nginx/redirect.map;
}

# server 段
if ($redirect_target) {
    return 301 https://$host$redirect_target;
}

这里有两个细节。第一,map 里写 410 的话上面这个 if 会返回 301 到 /410,不对。想区分 301 和 410,得用两个变量或者两个 map。第二,if 在 location 里用是安全的(这是 Nginx 官方少数推荐的 if 用法之一:return 和 rewrite),但不要在里面写 try_files、proxy_pass 之类。

更干净的做法是每一条单独写 location = /2021/xxx.html { return 301 /tech/new/; },精确匹配、优先级高、互不干扰,几十条也不慢。我最后的方案就是这样:一个 includes/redirects.conf 文件,每行一条 location,用脚本从 redirects 表生成,改完 nginx -t 再 reload。

一个更根本的问题:为什么会有这么多旧文

清理完之后我反思:这些文章的来源是「为了更新而更新」——每天必须发一篇,实在没东西写就凑个短笔记。三年下来积累了四百多篇,其中三百篇是凑数的。这不只是 SEO 问题,也是时间问题:那些时间如果用来写 30 篇有深度的,结果会完全不同。

所以现在我的发文规则改了:不再规定「每天 N 篇」,而是规定「每周至少 2 篇」,其余时间做更新和合并。存量内容的价值常常被低估——一篇三年前写对了的教程,每年带来的流量可能超过今年写的十五篇水文。清理存量不是怀旧,是把你已有的资产盘活。

最后提醒一句:删除是不可逆的操作里最轻的一种,但也别在刚看完一篇教程的当晚就动手删两百篇。先导出数据、先分类、先做 10 篇试试、看四周的流量,再决定要不要继续。这件事的正确节奏是慢,因为它的收益本来也是慢的。

Last modification:October 22nd, 2026 at 07:28 pm

Leave a Comment