GEO 官网的一次完整实操记录
作者:尔东陈在路上|知乎原文:GEO 官网的一次完整实操记录
作者:尔东陈在路上|发布日期:2026-08-18|原文:https://mp.weixin.qq.com/s/M-NUk5Zg8wFrRUkQiLhFOw

备案下来了,代码在 GitHub 上,构建也没问题——剩下的就是把它挂到自己的域名上。
这篇先说为什么选 ESA Pages 做 GEO 官网,再把整个流程、每个报错码,以及和 AI 搜索相关的配置一次写清楚。所有步骤、报错、验证命令都是控制台和 curl 实测所得。
—— ✦ ——
一、动手之前,先确认这几条
备案号拿到手只是第一步。真正会在中途拦住你的,是三个容易被跳过的细节。
备案主体必须和域名持有者一致。去域名控制台的基本信息里,核对「域名持有者(中文)」是否等于备案主体全称。不一致会在接入时被直接拦下。
备案号的序号要对得上这个域名。一个备案主体下,每个网站有独立序号(-1、-2、-5…)。去工信部备案系统核对 -N 那一条挂的到底是哪个域名,别想当然。展示错了属于备案信息不符。
代码里的绝对 URL 提前改成正式域名。canonical、sitemap、robots.txt、JSON-LD 里的 url 和 sameAs、OG 标签,上线后再改就要多跑一轮构建。
另外确认两件事:干净 clone 下 npm ci && npm run build 能跑通;构建产物到底在哪个目录——Vite 是 dist,Next 静态导出是 out,Hugo 是 public,后面要手填。
区域怎么选
ESA 建站时要选「获得加速与保护的区域」。中国内地和全球都需要备案,「全球(不含中国内地)」不需要。
已备案就选中国内地,最便宜,国内访问也最快。海外 AI 爬虫(GPTBot、ClaudeBot、PerplexityBot)访问内地节点只是慢一点,不影响抓取。等 GEO 见效、确有海外访问需求再升级不迟。
如果域名备案不在当前阿里云账号下,比如在腾讯云备的案,需要先做「接入备案」把备案接入阿里云,否则内地节点会拒绝服务。这条我没实际走过,本次备案与 ESA 在同一账号。
挑一个低风险时间窗
切 NS 会让原 DNS 服务商的全部解析记录立即失效。如果域名上还挂着正在用的企业邮箱、其他子域名服务,务必选业务低谷期操作,并预留 48 小时观察窗。
—— ✦ ——
二、顺序不能变,这是 ESA 的硬约束
建 ESA 站点(选 NS 接入)
↓
盘点并迁移原有 DNS 记录
↓
部署 Pages(可与上一步并行)
↓
在注册商处切 NS
↓
点「验证」激活站点
↓
绑定域名到 Pages
↓
等公网 DNS 传播
这个顺序不是偏好,是被强制的。
ESA 的「域名绑定」只接受已激活站点的域名,而站点激活的前提是 NS 已经切到 ESA 并通过验证。没切就去绑定,直接报 ActiveSiteNotExist。
所以不存在「先把网站部署好、测通了再切 NS」这条路。必然是先切 NS,再绑域名。这意味着从切 NS 到网站可访问之间,有一段实实在在的空窗期。
降低空窗风险只有一个办法:把不依赖 NS 的两件事先做完——DNS 记录迁移完整,Pages 构建成功。等它们都就绪再切 NS,空窗期就只剩 DNS 传播的时间。
—— ✦ ——
三、七步具体怎么走
1|创建 ESA 站点
控制台进「站点管理 → 新增站点」。站点填裸域(example.com),不要填 www——站点是以主域为单位的,www 只是它下面的一条记录。区域按上面选,接入方式选 NS,套餐免费版起步。
为什么不选 CNAME?因为裸域挂不了 CNAME。DNS 规范规定 CNAME 不能与同名的 NS、SOA、MX 共存,而裸域必然有 NS 和 SOA。CNAME 模式下裸域归一只能靠注册商的「隐性 URL 转发」这类土办法,不可靠。而且 NS 模式下证书自动签发续期,省掉手动 DNS 验证。CNAME 模式是给「DNS 在别家、不想动」的存量 CDN 用户准备的,新站没这包袱。
建站后在「站点概况」记下 ESA 分配的两个 NS 地址,形如 http://xxx.ns.atrustdns.com,第 4 步要用。
2|迁移 DNS 记录(最容易出事故的一步)
NS 一旦切到 ESA,原 DNS 服务商里的记录全部立即失效,只有 ESA 里的记录生效。漏迁一条,对应服务就断。
做法很笨但有效:去原服务商把全部记录截图或导出,逐条列成清单,再去 ESA 的 DNS 记录里逐条重建。
最容易漏的几类:MX 记录漏了收不到邮件;TXT 的 SPF 记录漏了发出去的邮件进垃圾箱;TXT 的 _dmarc 漏了邮件认证策略失效;各类验证用的 TXT 漏了微信公众号、Google、Bing 的站点校验全部失效;mail、smtp、pop3、imap 这几条 CNAME 漏了邮件客户端收发失败;_acme-challenge 漏了其他证书续期失败。还有后台、测试环境、文档站这些子域名的 A 和 CNAME。
迁移时有个关键设置:邮件相关的记录一律设为「仅 DNS」,不要开「代理加速」。邮件协议不能走 CDN 代理,开了就断。MX 的优先级也要和原来完全一致。
ESA 支持从 Cloudflare、阿里云 DNS、腾讯 DNSPod 导入 zone 文件,但要先去原服务商导出。记录在十条以内时,手工添加更快也更可控,而且强制你逐条核对一遍。
迁完自查:ESA 的记录条数要等于原服务商的条数,再逐条比对类型、主机记录、记录值、优先级。这一步宁可慢,不要漏。
3|部署 Pages(可与上一步并行)
「函数和 Pages → 创建应用 → 导入 Github 仓库」。首次要授权 GitHub 账号,授权后选中目标仓库即可。
构建配置里,安装命令 npm install,构建命令 npm run build,生产分支 main 或 master,Node 版本按项目选。静态资源目录必填,Vite 填 dist——这一项默认为空,ESA 不会自动探测构建产物在哪,留空会导致构建成功但站点空白或 404。函数文件路径留空,纯静态站不需要。
项目名称全账号唯一,重名会报 RoutineAlreadyExist。
顺带说一句为什么只能从 GitHub 导入:控制台没有本地目录上传入口。官方 esa-cli 支持 deploy --assets 部署本地目录,但只支持 AK/SK 或 STS Token 登录,要自己在终端跑一次 login。代码本来就在 GitHub 的话,走导入更省事,还自带 push 自动部署。
部署后确认项目卡片显示「构建成功」,并在「部署」标签页看到版本号与 commit 对应。之后每次 push 到生产分支会自动构建,不需要手动重新部署。
4|在注册商处切 NS
域名在阿里云的话,路径是:域名控制台 → 域名列表 → 管理 → DNS 管理 → DNS 修改 → 修改 DNS 服务器。把两个框分别填成第 1 步记下的 ESA NS 地址,需要短信验证。域名末尾不要加点。
这一步做完,原 DNS 服务商的记录就开始逐步失效了。确认第 2 步已经完成。
5|激活站点
回到「站点管理」,在站点行的状态列点「验证」。ESA 会去检测该域名的 NS 是否已指向自己,通过后状态从黄色的「待配置」变成绿色的「已启用」。
为什么要手动点:ESA 有自动巡检,但周期较长,手动触发能立刻推进。这一步不需要等公网 DNS 完全传播——ESA 查的是注册局侧的权威 NS 记录,改完很快就能查到。验证失败就等几分钟重试,反复失败说明 NS 没改对,回上一步核对。
6|绑定域名到 Pages
「函数和 Pages → 项目 → 域名标签 → 添加域名」,填 www.example.com。
绑定会隐式创建对应的 DNS 记录,但这条记录不会出现在 DNS 记录列表里,也不要手工再去添加。
这里最容易白折腾。手工添加会报 Record.RecordNameConflictForSpecifiedRecordType,意思是 A/AAAA 与 CNAME 不能重名——这个报错恰恰证明记录已经存在了。看到它就说明绑定已生效,直接进入下一步。
只绑 www 就够了。裸域上如果已有 MX 或 TXT 记录(有企业邮箱就一定有),绑定会报 Record.AlreadyExist——CNAME 不能与其他记录类型共存,这是 DNS 规范决定的。先把 www 跑通,裸域后面单独处理,不要同时引入变量。
7|等公网 DNS 传播
注册局侧改完不等于公网生效。各地递归 DNS 仍在用缓存的旧 NS,TTL 通常 3600 秒。阿里云提示 24 到 48 小时,实际常在数小时内完成。
验证方式:
curl -s -H 'accept: application/dns-json'
'https://223.5.5.5/resolve?name=example.com&type=NS'
返回的 data 是 ESA 的 *.http://ns.atrustdns.com 就说明已生效,还是旧的 NS 就继续等。也可以换 Cloudflare 的 1.1.1.1/dns-query 交叉验证。
为什么用 DoH 而不是 dig。如果本机开着 ***、Surge 这类代理软件且启用了 fake-ip 模式,所有 DNS 查询都会被劫持,一律返回 198.18.x.x 保留网段的假地址,连 dig @223.5.5.5 和直接查权威服务器都不例外。这种情况下 dig 的结果完全不可信。DoH 走 HTTPS,不受 fake-ip 影响。
传播期间浏览器报 ERR_CONNECTION_CLOSED、HTTP 502、curl 退出码 35,都是正常现象,会在传播完成后自行消失。只有传播完成后仍然报错,才需要排查配置。
证书这块无需任何操作。站点激活后 ESA 会自动签发 Let's Encrypt 泛域名免费证书,有效期三个月,平台自动续期。在「SSL/TLS → 边缘证书 → 证书管理」里应能看到一条状态为「正常」的免费证书。
—— ✦ ——
四、错误码速查
ActiveSiteNotExist
出现在绑定域名时。站点还没激活,先切 NS 再去站点管理点「验证」。
RoutineAlreadyExist
出现在创建 Pages 项目时。同名项目已存在,去项目列表看看,多半之前建过。
Record.AlreadyExist
出现在绑定裸域时。裸域上已有 MX 或 TXT,CNAME 无法共存,先把 www 跑通即可。
Record.RecordNameConflictForSpecifiedRecordType
出现在手工加 www 记录时。记录已由域名绑定隐式创建了,不用管,这是正常的。
ERR_CONNECTION_CLOSED / HTTP 502 / curl 退出码 35
DNS 未传播完,或证书还没下发到边缘。传播期正常现象,等就行。传播完成后仍然报错,才需要排查回源。

浙公网安备 33010602011771号