阿里云 OSS 静态站部署笔记

2026-06-08 首发 · 2026-06-11 增补 · 运维

给 Expo Web 导出的静态站和备案博客都试过 OSS。结论先说:OSS 适合存文件,但大陆用户要在浏览器里「像网站一样打开」,通常还得配 CDN + 已备案域名;备案审核前若 CDN 打不开,见后文链接的 ECS + Nginx 方案

桶域名为什么会下载?

访问 *.oss-cn-*.aliyuncs.com/index.html 时,OSS 会返回 Content-Disposition: attachmentx-oss-force-download: true,浏览器只会下载,不会渲染。 这是平台策略,不是单纯把 Content-Type 设成 text/html 就能解决的。

可在元数据里加 Content-Disposition: inline(我用 ossutil 的 set-props 批量处理),但桶 API 域名仍不适合当正式访问地址。验证网站请走 CDN / 自定义域名,或备案期的 ECS。

新版控制台没有 oss-website 端点

静态页面配置保存后,控制台往往不再显示「访问端点」。手打 桶名.oss-website-cn-xxx.aliyuncs.com 可能直接 NXDOMAIN。 要在浏览器里正常访问,需要 CDN + 自定义域名(且域名已完成 ICP 备案)。

CDN 与备案的死循环

给 CDN 绑加速域名(如 www.icemelt.fun)也要先备案。审核期间域名若 CNAME 到未备案的 CDN,外网经常是 403 / 打不开 — 备案又要求「能访问首页」,就容易卡住。

我的做法:备案审核中先把 DNS 改成 A 记录指 ECS,用 Nginx 托管静态页;备案通过后再考虑是否迁回 OSS+CDN。详见 备案期用 ECS 部署静态站

SPA(单页应用)静态托管配置

Emo 世界地图这类 React 单页应用,Bucket → 静态页面建议:

必须上传整个 dist,不能只传 index.html

index.html 引用的脚本在 /_expo/static/js/web/index-xxxxx.js。若桶根目录缺少 _expo/ 文件夹,页面只剩一句 “You need to enable JavaScript…”,或直接白屏。

控制台拖拽上传容易断线(「已停止」),且容易漏目录。推荐 ossutil 递归上传整个 dist/

地域:别用海外桶做大陆网站

建在迪拜等海外地域的桶,从国内上传常失败、访问也慢。网站桶请选华东 / 华南等国内地域,Endpoint 与桶一致,例如 oss-cn-shenzhen.aliyuncs.com

ossutil 2.x 命令行踩坑

同桶部署多个静态站:用路径前缀

博客(备案首页)和 Emo 应用若共用一个桶,不要都传到根目录,否则 index.html 会互相覆盖。

上传前看清脚本里的默认前缀,传错一次就要重新覆盖恢复博客文件。

上传后自检清单

  1. 桶里能看到 _expo/static/js/web/*.js,体积约数百 KB。
  2. 用 ossutil 或 CDN 域名访问,F12 → Network 里 JS 状态 200。
  3. 不要用桶 API 域名判断「网站能不能用」。
  4. 换版本后记得刷新 CDN 缓存(/index.html/_expo/*)。

和 ECS 方案怎么选

阶段 建议
备案审核中 ECS + Nginx + A 记录,先保证 www 能打开
备案通过后 可继续 ECS,或 OSS + CDN(DNS 改 CNAME,注意缓存)
纯对象存储备份 OSS 仍适合存构建产物、异地备份

← 全部文章