一个域名只挂一个平台
子域名同时挂在两个托管平台上,清理旧平台时差点连主域名一起删,殃及另一个还在服务的子域名
一个域名只挂一个平台;删除前先查同一主域下的全部依赖
发生了什么
我的一个子域名同时挂在两个托管平台上:新平台在正常服务,旧平台上还留着迁移前的部署和域名绑定。
清理时,我的第一反应是“干脆把整个主域名从旧平台移除”,一次清干净。动手前查了一遍同一主域下的依赖,才发现另一个子域名还在旧平台上提供服务。照原计划删,它会直接下线。
为什么会这样
两件事叠在了一起。
第一,迁移只做了“加”没做“减”。新平台接上、DNS 一改,访问一切正常,旧平台上的绑定就没人管了。残留不会报错,所以看不见。
第二,有些平台的域名是按“主域名”管理的。以 Vercel 为例,域名加在账号(团队)层面,子域名挂在下面;从账号里删除一个主域名,会把它从所有关联项目里移除,别名也跟着失效。你以为在删一个子域名,实际删的是一整棵树。
怎么做
定规则:一个域名(包括每个子域名)只挂一个平台;DNS 统一在 Cloudflare 管,DNS 记录就是“谁在服务哪个域名”的唯一清单。
删除前先列出主域下的全部记录,看每条指向哪个平台。在 Cloudflare 后台的 DNS 页面看,或者用 API。记录多时要翻页,只看第一页就可能漏掉还在服务的子域名;每页都检查返回状态,并先确认操作的是哪个账号:
#!/usr/bin/env bash
# 列出一个 zone 的全部 DNS 记录:先确认账号,逐页拉取,每页检查 success
set -euo pipefail
cf() { curl -s "https://api.cloudflare.com/client/v4/$1" -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"; }
ok() { jq -e '.success' >/dev/null <<<"$1" || { jq '.errors' <<<"$1" >&2; exit 1; }; }
zone=$(cf "zones/$ZONE_ID"); ok "$zone"
jq -r '.result | "zone: \(.name) account: \(.account.name)"' <<<"$zone"
page=1
while :; do
resp=$(cf "zones/$ZONE_ID/dns_records?per_page=100&page=$page"); ok "$resp"
jq -r '.result[] | "\(.type)\t\(.name)\t\(.content)"' <<<"$resp"
[ "$page" -ge "$(jq -r '.result_info.total_pages' <<<"$resp")" ] && break
page=$((page + 1))
done再去旧平台看还有谁在用。以 Vercel 为例,先确认登录的账号和团队,再按域名拉全部别名。vercel alias ls 一次最多列 100 条,用 vercel api 的 --paginate 取全:
vercel whoami
vercel api "/v4/aliases?domain=example.com" --paginate --scope your-team \
| jq -r '.. | .alias? | strings' | sort -u任何一步报错就停下,不要在不完整的结果上做删除决定。
由小到大地删:先解绑确认不用的子域名,观察几天访问日志或监控,确认没有流量了,再考虑删主域名。
迁移清单里写上“旧平台解绑”。新平台上线和旧平台解绑放在同一张清单里,一起打勾,别留到“以后再说”。