华为云 OBS 静态网站托管实战:从零搭建个人博客,附 7 个必踩的坑

举报
yd_265411139 发表于 2026/10/29 08:31:56 2026/10/29
【摘要】 华为云 OBS 静态网站托管实战:从零搭建个人博客,附 7 个必踩的坑摘要:个人博客就是一堆静态文件,用 OBS 静态网站托管最省事。本文手把手走完建桶、上传、配置公共读、开启静态托管、绑定自定义域名与 HTTPS 的完整流程,并集中拆解"权限不级联、HTML 被强制下载、默认端点没有 HTTPS、缓存不刷新"等 7 个高频坑点,帮你少走弯路。 一、为什么用 OBS 来"托管"个人博客个人...

华为云 OBS 静态网站托管实战:从零搭建个人博客,附 7 个必踩的坑

摘要:个人博客就是一堆静态文件,用 OBS 静态网站托管最省事。本文手把手走完建桶、上传、配置公共读、开启静态托管、绑定自定义域名与 HTTPS 的完整流程,并集中拆解"权限不级联、HTML 被强制下载、默认端点没有 HTTPS、缓存不刷新"等 7 个高频坑点,帮你少走弯路。

一、为什么用 OBS 来"托管"个人博客

个人博客本质是"一堆静态文件":HTML、CSS、JavaScript 和图片。它不需要数据库,也不需要后端逻辑。用云服务器 ECS 跑 Nginx 当然可以,但你会为"养一台机器"付出不少隐形成本:系统补丁、安全加固、带宽、以及 7×24 的运维。

华为云 OBS(对象存储服务)的"静态网站托管"把这些都省了:

  • 不需要服务器,上传文件即上线;
  • 按实际用量付费(存储 + 请求 + 流量),没有闲置成本;
  • 天生高可用、可弹性扩容,不怕突发流量;
  • 配合 CDN 后,访问速度与 HTTPS 一步到位。

代价是:OBS 的默认端点不是一个完整的网站托管服务,它有几个反直觉的限制,新手最容易在这里踩坑。本文先把完整流程走一遍,再集中讲坑。

二、动手前的准备

  1. 一个已完成实名认证的华为云账号;
  2. 本地准备好站点文件,最简单的就是 index.html,进阶可用 Hexo / Hugo 生成的静态站点;
  3. 一个已备案的域名(可选,但强烈建议)。国内区域绑定自定义域名需要完成 ICP 备案。

提示:如果只是想先体验,可以跳过域名,用 OBS 提供的默认域名访问;但它有几个限制(见第八节),不适合长期对外发布。

三、Step 1:创建存储桶(Bucket)

登录华为云控制台 → 对象存储服务 OBS → 创建桶。

要点:

  • 区域(Region):选离你和你读者都近的区域,例如 cn-north-4(华北-北京四)。区域创建后不可更改。
  • 桶名称:全局唯一(全球 OBS 用户共用命名空间),只能用小写字母、数字和连字符,3~63 个字符,不能以连字符开头或结尾,不能是 IP 形式。建议用 blogs-20261029 这种带时间戳的名字。
  • 存储类别:博客是访问频繁的小文件,选"标准"即可。
  • 桶策略:先保持"私有",权限我们在 Step 3 单独、精确地放开。

【建议配图:创建桶页面,标注区域 / 桶名 / 存储类别】

四、Step 2:上传站点文件

进入桶 → 对象 → 上传对象,把 index.html、css/、js/、images/ 等全部传上去。

命令行方式(obsutil / KooCLI OBS 语法):

# 上传整个目录到桶根目录:-r 递归,-f 免交互,-flat 不保留本地目录名前缀
hcloud OBS cp dist/ obs://blogs-20261029/ -r -f -flat

两个容易吃亏的细节:

  • 目录上传会带上前缀:不加 -flat 时,dist/index.html 会上传成 blogs-20261029/dist/index.html,导致首页 404。用 -flat,或先预览键名再传。
  • 必须加 -f:否则大批量上传或覆盖时会卡在 Please input (y/n) 的交互提示上,脚本和自动化场景会直接挂起。

上传完成后,桶里的文件应位于根目录,即 index.html 在 obs://blogs-20261029/index.html。

五、Step 3:把内容设为"匿名可读"(桶级 + 对象级)

这是第一个大坑:桶的 ACL 不会级联到对象。

如果你只把桶设置成公共读,浏览器访问 index.html 仍会得到 403 AccessDenied。OBS 的权限是三层结构(IAM > 桶策略 > ACL,最严格者生效),并且对象拥有自己独立的 ACL。

所以两层都要做:

# 1) 桶级
hcloud OBS chattri obs://blogs-20261029 -acl=public-read
# 2) 对象级(对象 ACL 不会继承桶 ACL,必须单独设置)
hcloud OBS chattri obs://blogs-20261029/ -r -f -acl=public-read

控制台做法:桶 → 权限管理 → 桶 ACL 设为"公共读";再全选对象 → 对象 ACL 设为"公共读"。

安全提醒:public-read 意味着任何拿到链接的人都能读取文件。博客这种本就公开的内容没问题,但千万不要把存放敏感数据的桶设为公共读。

六、Step 4:开启静态网站托管

桶 → 基础配置 → 静态网站托管 → 配置:

  • 默认首页(IndexDocument):填 index.html。
  • 默认错误页(ErrorDocument):填 404.html;如果是 SPA(Vue Router / React Router),错误页也填 index.html,让前端路由接管。

保存后,OBS 会给你一个静态网站托管访问域名:

http://<桶名>.obs-website.<区域>.myhuaweicloud.com
例如:http://blogs-20261029.obs-website.cn-north-4.myhuaweicloud.com

注意:这个 obs-website 域名和普通对象域名 https://<桶名>.obs.<区域>.myhuaweicloud.com 是两个不同的域名,用途不同——前者用于网站访问,后者用于直接取对象。

【建议配图:静态网站托管配置页,标注默认首页 / 错误页】

七、Step 5:验证访问

curl -I http://blogs-20261029.obs-website.cn-north-4.myhuaweicloud.com/index.html

一个常见的"诈尸"现象:刚配置完用网站域名访问会返回 404 NoSuchWebsiteConfiguration。这不是配置失败,而是网站端点有约 1 分钟的最终一致性延迟。可以先用对象地址 https://<桶名>.obs.<区域>.myhuaweicloud.com/index.html 确认文件本身没问题,再轮询网站域名直到返回 200。

八、Step 6:自定义域名 + HTTPS(这一步几乎绕不开)

如果你真要把博客对外发布,只靠 OBS 默认域名是不够的,原因有三:

  1. 默认静态托管端点不支持 HTTPS,只有 HTTP,浏览器会提示"不安全",对 SEO 也不友好;
  2. 2022 年 1 月 1 日之后创建的桶,通过 OBS 端点访问 HTML 会被强制注入 Content-Disposition: attachment——结果是浏览器直接下载页面,而不是渲染。这是 OBS 的策略行为,和对象元数据无关,网站端点和对象端点都躲不掉;
  3. 默认域名难记,也不利于品牌。

所以推荐路径是:自定义域名 + 华为云 CDN 加速。CDN 一次性解决 HTTPS、渲染(inline 响应头)和缓存加速三个问题。

操作步骤(以控制台为例,菜单名称以实际界面为准):

  1. 域名备案:绑定国内节点的域名需要完成 ICP 备案。

  2. 进入 CDN 控制台 → 域名管理 → 添加域名:

    • 加速域名:blog.example.com;
    • 源站类型:选择 OBS 桶域名(回源到你的静态网站托管域名);
    • 配置 CNAME:把域名解析 CNAME 指向 CDN 分配给你的加速域名。
  3. 配置 HTTPS:在 CDN 域名管理中开启 HTTPS,选择华为云证书管理服务(CCM)里已签发的证书(可用免费证书)。

  4. 关键一步——加响应头让 HTML 在线渲染:CDN 域名管理 → 高级设置 → HTTP header 配置,添加响应头:

    Content-Disposition: inline
    

    这一步正是上面第 2 条"网页被下载"的官方解法。

  5. 回到 OBS,把自定义域名也绑定到桶(桶 → 域名管理 → 自定义域名),保持一致。

完成后访问 https://blog.example.com,应该看到正常渲染的博客首页,地址栏出现锁头图标。

九、7 个高频坑与解法(速查)

# 现象 根因 解法
1 访问对象返回 403 AccessDenied 只设了桶 ACL,对象 ACL 仍为私有;ACL 不级联 桶级 + 对象级都设 public-read
2 首页 404 / 路径多一层目录名 目录上传保留了本地文件夹前缀 上传加 -flat,先 -dryRun 预览键名
3 刚配置完访问网站域名返回 404 网站端点最终一致,约 1 分钟 等一会,先用对象地址验证文件
4 浏览器直接下载 HTML 而不是打开 2022 年后创建的桶被强制加 Content-Disposition: attachment 绑定自定义域名 + CDN,配置响应头 Content-Disposition: inline
5 地址栏没有 HTTPS / 提示不安全 OBS 默认静态托管端点不支持 HTTPS 自定义域名 + CDN 配置证书
6 更新文件后浏览器仍是旧页面 CDN / 浏览器缓存未失效 CDN 刷新缓存,或给资源加 ?v=版本号
7 上传脚本卡住不动 obsutil 遇覆盖或批量操作会交互询问 命令一律加 -f,如 cp ... -f

十、成本与安全建议

成本:OBS 按存储容量、请求次数和公网流出流量计费。个人博客文件通常很小,存储费几乎可以忽略,主要的钱花在下行流量上。加上 CDN 后流量走 CDN,通常更省也更快,但 CDN 有独立计费,建议在费用中心设置预算告警。

安全:

  • 只对确实需要公开的内容设置 public-read;
  • 全程使用 HTTPS,避免内容被篡改;
  • AK/SK 属于账号级凭据,绝不写进前端代码或桶策略,建议用 IAM 子用户并最小授权;
  • 可开启桶访问日志,便于审计。

十一、小结

用 OBS 静态网站托管个人博客,本质上是"把运维成本换成对产品限制的理解成本"。流程并不复杂:建桶 → 传文件 → 桶与对象双层公共读 → 开静态托管 → 自定义域名 + CDN 上 HTTPS 与 inline 头。真正绊住人的,几乎都是第八、九节那几个反直觉的限制。

如果正要开工,记住一条排障顺序:先用对象地址确认文件没问题,再用网站域名确认托管配置,最后用自定义域名跑通 HTTPS 与渲染。一层层排,问题就永远在你脚下。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。