备案后 Emo 从 /emo/ 子路径迁到 emo.icemelt.fun

2026-06-22 · 运维

备案期我把 Emo 世界地图挂在 https://www.icemelt.fun/emo/ — 子域未入备案时会被阿里云 403,子路径可以共用 www 的 HTTPS 证书。主站拿到 粤ICP备2026080131号-1 之后,我把应用迁到独立子域 emo.icemelt.fun,并在博客侧保留 /emo/301 跳转,旧链接不会断。

为什么要换

迁移前后对照

子路径(备案期) 子域名(现在)
访问地址 https://www.icemelt.fun/emo/ https://emo.icemelt.fun/
构建 EXPO_PUBLIC_BASE_PATH=/emo EXPO_PUBLIC_BASE_PATH=(空)
资源路径 /emo/_expo/... /_expo/...
HTTPS 共用 www 证书 certbot --nginx -d emo.icemelt.fun
高德白名单 www.icemelt.fun emo.icemelt.fun
旧链接 Nginx 301 → https://emo.icemelt.fun/

操作步骤

1. DNS 与备案

域名解析增加 emo → A → 你的 ECS 公网 IP;在备案控制台确认 emo.icemelt.fun 已挂在同一备案号下。

2. 根路径重新构建并上传

emo-world-map 仓库:

cd ~/Projects/emo-world-map
EXPO_PUBLIC_BASE_PATH= ./deploy/server-deploy.sh
# 或:npm run build:web:root && DEPLOY_HOST=你的ECS公网IP ./deploy/server-sync.sh

构建完成后检查 dist/index.html:脚本应是 src="/_expo/static/js/web/..."不能再是 /emo/_expo/...

3. 子域 HTTPS

ssh root@你的ECS
certbot --nginx -d emo.icemelt.fun --redirect

4. 博客侧 301(兼容旧 URL)

www 的 Nginx server 里删掉原来的 alias /emo/,改成永久跳转:

location ~ ^/emo/?(.*)$ {
    return 301 https://emo.icemelt.fun/$1$is_args$args;
}

这样 /emo/emo/ 以及带 query 的旧书签都会落到子域。博客其它路径不受影响。

5. 高德控制台

Web 端 Key 的域名白名单加上 emo.icemelt.fun。地图定位在浏览器里要求 HTTPS + 白名单同时满足。

踩坑:子域打开一片空白

我迁过去后证书正常,但页面只剩白屏,开发者工具里主 JS 请求失败,Preview 显示 You need to enable JavaScript to run this app. — 其实是 HTML 壳子加载了,JS 没执行。

原因一:构建仍带了 /emo 前缀。 我执行过:

EXPO_PUBLIC_BASE_PATH= ./deploy/server-deploy.sh

但脚本里若写成 ${EXPO_PUBLIC_BASE_PATH:-/emo},Bash 会把空字符串也当成「未设置」,仍然默认成 /emo。子域上请求 /emo/_expo/....js 文件不存在,Nginx 的 SPA 回退又把 index.html 当 JS 返回(200),浏览器解析失败 → 白屏。

修法:部署脚本改用「仅未定义时才默认 /emo」;或直接用 npm run build:web:root。上传前务必看一眼 dist/index.html 里的 <script src=

原因二:子域 Nginx 要对 /_expo//assets/ 显式 try_files ... =404, 别让缺失的静态资源掉进 location / { ... /index.html; } 的 SPA 回退,否则排错时容易被 200 误导。

与备案期那篇的关系

ECS + Nginx 备案部署里的子路径方案仍然有效,适合审核完成前。 备案通过后若要上子域,按本文换构建参数和 Nginx 即可;服务器目录仍是 /var/www/icemelt-blog + /var/www/emo-world-map 同级,不必把 Emo 塞进博客目录。

打开 Emo 世界地图

← 全部文章