11 月 10 号晚上九点多,上海市金山区,外面在下雨。
我在改首页,本来只是想把两篇新文章加进"最新文章",改到一半停住了——因为我发现这个首页的结构已经乱了很久,只是我一直没细看。
一、先看清楚乱在哪
我的首页是纯静态的,三个板块全是写死在 HTML 里的卡片,不靠 JS 渲染。所以每次发文章,我都得手动往对应板块里塞一个 <a class="card">。
塞着塞着就出问题了。那天我把整页的卡片抓下来数了一遍,48 张,去重之后 34 张。
三个毛病:
毛病一,"常用软件"里一张软件都没有。
这个板块里塞了 14 张卡,全是备案经验、Docker 部署、NAS 搭建这类技术文章。我当初大概是图省事,新文章一律往最后一个板块加,加着加着"常用软件"就成了垃圾筐。
一个访客点"常用软件",想看的是能装的东西,结果看到的是《备案被驳回 7 次》《Portainer 面板》——这个体验是坏的。
毛病二,"最新文章"堆了 34 张。
从 11 月 9 号一路排到 10 月 28 号,横跨十几天。叫"最新",实际上是一份过期很久的快照。
毛病三,两个板块重复了 14 张卡。
同一篇文章,在"最新文章"里出现一次,往下滚又在"常用软件"里出现一次。页面上重复内容,对搜索引擎是不友好的——它得花配额去判断这两块是不是同一份东西。
二、三个板块该怎么切
我想了一下访问者的动线,定了个规则:
| 板块 | 放什么 | 数量 |
|---|---|---|
| 最新文章 | 三天内发布的 | 9 |
| 技术分享 | 其余全部文章 | 25 → 44 |
| 常用软件 | 真的软件介绍 | 2 |
"三天内"这条线是照着实用来定的:一个常来看的人,隔两三天来一次,打开首页就能看到新的;超过三天的,归到技术分享里按时间往下排,谁想找都能找到。
"常用软件"只放软件卡,而且只放真的能用的。我站上的软件本来有三个:君陌工具箱、Cloudreve、DDNS-Go。前一个现在内测、页面上写着"暂不对外提供",放进"常用软件"等于又告诉人"这儿有个软件",跟备案整改的方向是拧着的。所以最后只放了 Cloudreve 和 DDNS-Go 两个。
三、动手,用脚本而不是手改
34 张卡手动挪,一是慢,二是一定会漏。我写了个 Python 脚本在服务器上跑。
第一步,把所有卡片连同 href 一起抓出来:
pat = re.compile(r'<a class="card" href="(/post/[^"]+)">.*?</a>', re.S)
blocks = {}
for m in re.finditer(pat, s):
if m.group(1) not in blocks:
blocks[m.group(1)] = m.group(0)
用 href 做 key 去重,48 张变 34 张。
第二步,从每张卡的 <span> 里把日期抠出来,按日期倒序排,然后切一刀:
recent = [kv for kv in allc if dt(kv[0]) >= "2026-11-08"]
rest = [kv for kv in allc if dt(kv[0]) < "2026-11-08"]
第三步,重新拼三个 <section>。"最新文章"和"技术分享"保持原来的卡片样式,各自带一个「查看更多 →」按钮跳列表页。
"常用软件"要换模板——不能用文章卡,得用软件卡。我把原来 renderSoftwareList 里那套 SVG 立方体图标和 card-tag software 的样式搬过来,重新生成了两张:
<div class="card" onclick="showSoftwareDetail(1)">
<div class="card-cover software">...SVG 立方体...</div>
<div class="card-body">
<span class="card-tag software">软件</span>
<h3 class="card-title">Cloudreve 网盘系统</h3>
...
</div>
</div>
点开走 showSoftwareDetail(),跟列表页里的软件详情是一套。
改完 248615 字节变 240229 字节,少的 8385 字节就是去掉的重复卡。
四、然后发现还有 19 篇压根没上首页
改完我去服务器上 ls 了一遍 /post/ 目录。
53 个 HTML 文件。
而首页只有 34 张卡。
差的 19 篇是 01 号到 22 号那批早期文章——E5-2696V3 折腾、2014 款 Mac mini 改造、内网穿透、VMware 断网、公网 IP、X99 寨板降压……这些我自己觉得写得还行的稿子,全躺在 /post/ 目录里,只在「全部文章」列表页出现过一次,首页一张卡都没有。
原因很简单:这些是早期写的,那时候首页结构跟现在不一样,后来搭首页的时候只挂了新写的 23 号之后的,老的一直没补。
补的办法:从每个 HTML 文件里读 <title>、meta description、datePublished、og:image,生成标准文章卡,按日期倒序插到"技术分享"的末尾。
封面直接用各篇自己的 og:image,转成相对路径 assets/xx-cover.jpg。有两个文件缺图,兜底用了 assets/02-cover.jpg。
结果:25 张变 44 张,文件 240229 变 250666 字节。
这里有个数字对上了: 首页文章卡从 34 张变成 53 张,正好等于 /post/ 目录里 53 个页面。
五、验证
改完不敢直接信,回读了一遍线上页面:
- HTTP 200,250666 字节
- div 227/227、section 5/5、a 标签 76/76,全部配对
- 三个板块:最新文章 9(11-08~11-09)、技术分享 44(10-21~11-07)、常用软件 2
- 文章卡 53 张,去重后唯一 53 张,零重复
- 34 条文章链接逐条请求,全部 200,没有死链
- 新补的 19 条单独再请求一遍,也全 200
六、说说这么改对收录有没有用
我说几句自己的判断,不一定对。
去重是有用的。 原来 14 张卡在两个板块各出现一次,现在一张卡只出现一次。页面的重复内容比例降下来了。
内链密度上来了。 首页现在有 53 条指向文章页的内链。首页是全站被爬最频繁的页面,从首页能直接走到的页面,被发现的速度会快一些。原来 19 篇早期文章只能从列表页进去,现在首页就有了。
分类入口多了一条。 上次改搜索框的时候,我把输入框换成了 6 个分类胶囊链接(Docker、NAS、备案、SEO、AI、硬件),这次它们还在,等于首页同时给了两条往下钻的路。
七、静态站的一个真实短板
最后说个不太好听的。
这套东西是写死在 HTML 里的,它不会自己动。
今天 11 月 10 号,"最新文章"卡在 11 月 8 号这条线。到 11 月 13 号,11 月 8 号那两篇就不再是"三天内"了,应该挪进技术分享——但静态页面不会自己挪,它就那么放着,一天天变旧,最后又变回我当初想改掉的那个样子。
有两条路:
一是每次发文章时手动挪,靠人记。我清楚自己的记性。
二是加个每天跑的脚本,判断日期、自动搬卡。我已经有个每天 0 点推百度的定时任务了,多挂一个不算麻烦。
这篇先记在这儿。等哪天"最新文章"又变成十几天跨度的时候,我就知道该动手了。
如果你也在维护一个自己手写的静态站,被首页板块结构折腾过,可以加我微信 lige0552 聊聊。白天要上班,消息回得慢,看到都会回。