阿里云 OSS 静态站部署笔记
给 Expo Web 导出的静态站和备案博客都试过 OSS。结论先说:OSS 适合存文件,但大陆用户要在浏览器里「像网站一样打开」,通常还得配 CDN + 已备案域名;备案审核前若 CDN 打不开,见后文链接的 ECS + Nginx 方案。
桶域名为什么会下载?
访问 *.oss-cn-*.aliyuncs.com/index.html 时,OSS 会返回
Content-Disposition: attachment 和 x-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 → 静态页面建议:
- 默认首页:
index.html - 默认 404 页:
index.html - 错误文档响应码:200(不要选 404,否则刷新子路径异常)
- 桶权限:公共读(进阶可私有 + CDN 回源鉴权)
必须上传整个 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 命令行踩坑
-
旧版安装包 404:官方已主推 2.x,可从 CDN 下
ossutil-2.3.0-mac-amd64.zip(Apple Silicon 用 arm64)。 -
region must be set in sign version 4:上传时要带--region cn-shenzhen(与桶地域一致),或在ossutil config里填 Region。 -
Mac 自带 bash 3.2:部署脚本里别写「全角括号包变量」如
($OSSUTIL),在set -u下会报 unbound variable;应写${OSSUTIL}。 -
配置完成后用
./deploy/fix-oss-meta.sh统一设 HTML 的 Content-Type 与inline。
同桶部署多个静态站:用路径前缀
博客(备案首页)和 Emo 应用若共用一个桶,不要都传到根目录,否则
index.html 会互相覆盖。
- 博客 / 备案站:
OSS_PREFIX=(空)→ 桶根目录 →www.icemelt.fun - Emo 应用:
OSS_PREFIX=emo/→ CDN 子域或回源路径/emo
上传前看清脚本里的默认前缀,传错一次就要重新覆盖恢复博客文件。
上传后自检清单
- 桶里能看到
_expo/static/js/web/*.js,体积约数百 KB。 - 用 ossutil 或 CDN 域名访问,F12 → Network 里 JS 状态 200。
- 不要用桶 API 域名判断「网站能不能用」。
- 换版本后记得刷新 CDN 缓存(
/index.html、/_expo/*)。
和 ECS 方案怎么选
| 阶段 | 建议 |
|---|---|
| 备案审核中 | ECS + Nginx + A 记录,先保证 www 能打开 |
| 备案通过后 | 可继续 ECS,或 OSS + CDN(DNS 改 CNAME,注意缓存) |
| 纯对象存储备份 | OSS 仍适合存构建产物、异地备份 |