备案后 Emo 从 /emo/ 子路径迁到 emo.icemelt.fun
备案期我把 Emo 世界地图挂在
https://www.icemelt.fun/emo/ — 子域未入备案时会被阿里云 403,子路径可以共用
www 的 HTTPS 证书。主站拿到
粤ICP备2026080131号-1
之后,我把应用迁到独立子域 emo.icemelt.fun,并在博客侧保留
/emo/ 的 301 跳转,旧链接不会断。
为什么要换
- URL 更短:分享、高德白名单、证书都按子域管理,更像独立产品。
- 构建更简单:子域是站点根路径,
EXPO_PUBLIC_BASE_PATH留空即可,不必让所有静态资源带/emo前缀。 - 博客不动:
www.icemelt.fun仍只托管本博客,Emo 文件仍在同级目录/var/www/emo-world-map,只是 Nginx 用不同server_name指向它。
迁移前后对照
| 项 | 子路径(备案期) | 子域名(现在) |
|---|---|---|
| 访问地址 | 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 塞进博客目录。