返回首页

把博客搬进对象存储:Hugo + OSS 建站踩坑全记录

2026-09-26 折腾

这个周末干了一件事:把博客从动态程序整个搬到了对象存储上,变成一个纯静态站。现在你看到的每个页面,都是从 OSS 上吐出来的一坨 HTML,没有服务器、没有数据库、没有 PHP。

期间踩的坑不少,值得记一笔。

为什么要静态化

原来的博客跑在一台服务器上,动态渲染,看着挺美好,但烦心事也实在:

  • 不更新也得养着服务器,一年几百块钱就为了伺候几个页面;
  • 安全更新、插件兼容、数据库备份,样样都是精神税;
  • 访问量本来就不大,动态渲染纯属杀鸡用牛刀。

而静态化之后:内容就是文件,构建就是编译,部署就是上传。服务器费用直接归零——OSS 按量付费,我这个流量水平一个月几块钱,电费级别。

为什么选 Hugo

静态站生成器一大把:Hexo、Hugo、Astro、Eleventy。我选 Hugo 的理由很简单:单个二进制文件,零依赖,构建快到离谱。全站几十个页面,构建耗时不到一秒。Windows 上下载解压就能用,不用先装一堆 Node 模块烧香祈祷。

主题没找现成的,自己写了一个——反正页面就三种:首页列表、文章详情、分类归档。手写模板半天搞定,改起来也随心。

部署:OSS 静态网站托管

阿里云 OSS 自带静态网站托管功能,配置三件套:

  1. 索引页:index.html,访问目录时自动找它;
  2. 错误页:404.html,配合 Hugo 生成的 404 页面;
  3. 自定义域名:域名 CNAME 到 bucket 端点,挂上免费证书,HTTPS 就有了。

上传用官方的 ossutil 命令行,一条 sync 把构建产物全推上去,以后更新也是它。

坑,一个接一个

坑一:目录占位对象

ossutil 上传时会顺手给每个文件夹创建一个 0 字节的"目录对象",名字长得像 kindle-clock/。这玩意在对象存储里是"文件夹"的模拟物,但在静态托管里是灾难——访问 /kindle-clock/ 时 OSS 优先命中了这个空对象,返回一个 0 字节的空响应。页面白屏。

解法:上传后把所有名字以 / 结尾的对象统统删掉。真正的页面文件都是 目录/index.html 的形式,删占位对象不影响任何东西。

坑二:子目录索引页默认关闭

删完占位对象,子页面还是不对——访问 /kindle-clock/ 居然返回首页内容。查了半天才发现,OSS 静态托管的**“子目录索引页"开关默认是关的**。开着的时候,访问 /kindle-clock/ 会自动去找 kindle-clock/index.html;关着的时候,找不到就回落到错误页。在控制台把"子目录首页"打开(或者 API 里把 SupportSubDir 设为 true),一切正常。

这个坑的隐蔽之处在于:首页完全正常,让你以为部署成功了,直到你点进一篇文章才发现内容不对。上线前一定要逐页点一遍,别只看首页。

坑三:HEAD 请求的假象

排查时发现 curl -I(HEAD 请求)访问首页返回 403,吓得我以为权限又配错了。后来才明白 OSS 静态托管对 HEAD 请求的处理和 GET 不一样,很多在线"网站测死链"工具用的正是 HEAD 请求,会给你报一堆假 403。以浏览器实际行为(GET)为准。

坑四:切换 DNS 之后的"鬼影”

域名解析切过去之后,自己浏览器还是打不开、证书报警。查了半天服务器端一切正常——是浏览器自己的 DNS 缓存还指着老地方。清系统缓存(ipconfig /flushdns)不够,浏览器还有一层独立的 DNS 缓存,得去 chrome://net-internals/#dns 里手动清,或者干脆重启浏览器。

URL 设计:别用中文

一开始分类的 URL 是自动生成的中文,访问起来变成一长串 %E6%8A%98%E8%85%BE。分享出去难看,搜索引擎展示也容易截断。

后来统一改成:文章 /:slug/,分类 /categories/tech/ 这样的英文短横线 slug,页面标题照样是中文。URL 是给机器和链接用的,标题是给人看的,各司其职。顺手把 sitemap.xml 和 robots.txt 配上——Hugo 原生支持,几行配置的事。

花了多少钱

存储:全站不到 1MB,每月一分钱。流量:按量付费,0.5 元/GB,个人博客一个月撑死几个 G。粗算一年 10~30 块钱。看过资源包的价格表之后得出结论:流量包是给月流量几十上百 GB 的站点省钱用的,个人博客买它纯属做慈善。

唯一要防的是被人恶意刷流量——去费用中心设个月度告警阈值,几块钱的事买个安心。

总结

整条链路跑下来,最深的体会是:静态化的复杂度不在构建,在部署的边角。Hugo 十分钟就能上手,真正费时间的是 OSS 那些默认值不合理的开关、目录对象的怪癖、以及 DNS 切换后的缓存鬼影。

不过踩完这些坑,收获的是一套几乎零成本、零运维的博客系统。以后写文章就是:写好 markdown,构建,同步,完事。

值了。