Hexo 排坑记:删除所有文章后首页无法访问(Cannot GET)
背景
最近在使用 Hexo + Butterfly 主题搭建个人博客时,遇到一个奇怪的问题:我把source/_posts下的所有文章都删掉后,重新生成并启动本地服务器,访问http://localhost:4000竟然直接显示Cannot GET /,首页完全打不开。
原因分析
Hexo 作为静态站点生成器,理论上即使没有任何文章,也应该生成一个“暂无文章”的首页。但为什么我的博客却直接 404 了呢?
经过排查和查阅资料,发现问题出在Butterfly 主题对空文章列表的处理上:
- Butterfly 主题的首页布局(
index.ejs)中包含了获取文章列表并渲染的代码。 - 当
_posts文件夹为空时,page.posts返回的是一个空数组,某些主题或插件在遍历空数组时可能触发了异常(但被静默捕获,没有输出到终端)。 - 这个异常导致 Hexo 认为首页不需要生成,于是跳过了
index.html的创建。
本质上,这不是 Hexo 的强制要求,而是 Butterfly 主题(或某些插件)没有对空文章列表做兼容处理。
解决方案
方案一:保留至少一篇文章
在source/_posts目录下新建一篇占位文章,例如welcome.md:
---title:欢迎来到我的博客date:2026-05-23---这里会陆续更新技术文章,敬请期待~之后博客就能正常访问了。这个方法成本最低,适合大多数用户。
方案二:修改主题模板
如果你希望即使没有任何文章也能正常显示首页,可以自行修改 Butterfly 主题的index.ejs文件(路径:themes/butterfly/layout/index.ejs)。
找到文章列表渲染的代码块,添加空值判断:
<% if (page.posts && page.posts.length) { %> // 正常渲染文章列表 <div class="recent-posts"> <% page.posts.each(function(post){ %> // 文章卡片代码 <% }) %> </div> <% } else { %> <div class="no-articles"> 暂无文章,敬请期待。 </div> <% } %>修改后重新hexo clean && hexo generate即可。
总结
| 现象 | 原因 | 推荐解决 |
|---|---|---|
删除所有文章后首页 404,且public/index.html缺失 | 主题或插件无法正确处理空文章列表,渲染被跳过 | 保留至少一篇占位文章 |
这个坑我踩了一下午,记录在此,希望能帮到同样使用 Hexo + Butterfly 的朋友。
