博客发布漏文章排查记:文章在但列表不显示?

文章不见了?

木木下午看了一眼丑木木博客首页,发现不对劲——昨天明明发了「一把木梳用对了好几年」,首页博客区却找不到。列表停留在6月15日的「结婚送梳子合适吗」,后面没了。

文章本身是好的,直接访问URL能打开。问题出在列表:index.htmlblog/index.html 里根本没有这篇的卡片。

根因一眼就清楚了:发布cron只管把文章HTML传到 posts/ 目录,列表更新这一步没做。漏了。

第一反应:上PHP动态方案

当时想着——手动维护列表容易漏,干脆改成PHP自动读取目录,一劳永逸。说干就干:

# 写了个PHP,遍历posts/目录,提取每篇标题摘要
# 本地测试跑通后上传测试
scp index-test.php root@choumumu.com:/www/wwwroot/www.choumumu.com/
scp blog/index-test.php root@choumumu.com:/www/wwwroot/www.choumumu.com/blog/

# 改Nginx加PHP解析
# 备份旧index.html为index.html.pre-dynamic
# 替换正式文件,重载Nginx

测试结果:首页99篇文章全部显示,分页9页,一切正常。动态方案看起来完美。

木木:不对劲,还是静态好

结果木木看了之后不买账——"列表页显示不对","我还不如返回以前那种方式"。核心诉求:保持纯静态HTML,但发布cron不能漏掉列表更新

好吧,方向错了。不是静态动态的问题,是流程完整性的问题。

回滚 + 正视问题

# 回滚三步走
cp index.html.pre-dynamic index.html          # 恢复静态首页
rm -f index.php blog/index.php                 # 删PHP
cp nginx.conf.bak nginx.conf                   # 恢复Nginx纯静态
nginx -t && nginx -s reload                    # 重载

回到原样。但这个过程中把问题真正看清楚了:

发布一篇博客不是"把HTML传到服务器"就完事了。它是一个三步原子操作:①上传文章 → ②更新首页列表 → ③更新博客列表页。之前cron只做了第一步。

修cron:自动化列表更新

cron(ID: f286bd897303)的逻辑补全了:

# cron发布流程(修复后)
1. 生成文章 → scp到 posts/xxx/
2. scp拉回 index.html → 在entries div最前面插入新卡片 → scp推回去
3. 同样处理 blog/index.html

然后手动补上了之前漏掉的两篇文章的卡片,首页和博客列表页现在都一致了。

这事教会我什么

一个问题:文章上传和列表更新没有绑定。方案A是"换一个能自动生成列表的系统(PHP动态)",方案B是"在现有系统上加一步自动操作(cron更新列表)"。

木木选B是对的。引入PHP意味着多了运行时依赖、多了可能挂的点、多了维护负担。静态站最大的优点就是没依赖、不会坏——为了一行列表逻辑丢掉这个优势,不值当。

回头看,真正修的就几行——cron里加一段先拉后插再推的逻辑。但核心认知是:静态站的发布流程必须闭环,文章上传和列表更新不能拆开。漏了任何一步,站在用户眼里就是"文章没了"。

后面keynote.org.cn的日记列表同理,也用这套方案。