Vercel 国内被墙修改 CNAME 域名解析
解决方法
进入到自己的域名管理页面中
将域名解析修改如下
- 记录类型修改为
CNAME - 记录值修改为:
cname-china.vercel-dns.com.

为什么改一个 CNAME 就能通
Vercel 默认让你把域名 CNAME 到 cname.vercel-dns.com,这个域名解析出来的 IP 属于 Vercel 的全球 Anycast 网段,其中一批 IP(历史上 76.76.21.21 这一段最出名)被墙掉了。域名本身没问题,是解析出来的 IP 不通,所以表现是 ping 有响应但 curl 卡住、或者 TLS 握手阶段被 RST。
cname-china.vercel-dns.com 是 Vercel 单独准备的一组解析结果,指向的 IP 段和默认那组不同,国内可达性好一些。注意它不是「Vercel 在国内有节点」——Vercel 没有国内机房,请求还是要出境,所以延迟依然在 200ms 以上,只是不再被直接阻断。
末尾那个点(cname-china.vercel-dns.com.)是 DNS 的完全限定域名(FQDN)写法,表示这是绝对域名、不要再拼上自己的域名后缀。腾讯云 DNSPod 的控制台会自动处理,加不加都行;但有些 DNS 服务商(尤其是自建 BIND 的)不加点会被解析成 cname-china.vercel-dns.com.wflynn.cn,那就彻底解析不到了。养成加点的习惯不会错。
改完怎么验证
DNS 有缓存,改完不会立刻生效。先确认权威 DNS 已经更新,绕过本地缓存直接问公共 DNS:
# 问 Google DNS,看返回的 CNAME 对不对
dig @8.8.8.8 wflynn.cn CNAME +short
# 问国内的 DNSPod 公共 DNS,看国内视角的解析结果
dig @119.29.29.29 wflynn.cn +short
dig 在 macOS 上自带,Windows 没有,用 nslookup 代替:
nslookup -type=cname wflynn.cn 8.8.8.8
看到 CNAME 已经是 cname-china.vercel-dns.com 之后,再测实际连通性:
# 只看 HTTP 状态码,不打印 body
curl -sI -o /dev/null -w "%{http_code} %{time_total}s\n" https://wflynn.cn
# 想看走的是哪个 IP
curl -sI -o /dev/null -w "%{remote_ip}\n" https://wflynn.cn
如果 dig 结果对了但浏览器还是打不开,是本地 DNS 缓存没过期。macOS 清缓存:
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
Windows:
ipconfig /flushdns
Chrome 自己还有一层 DNS 缓存,地址栏输入 chrome://net-internals/#dns 点 Clear host cache。
TTL 也影响生效速度。DNSPod 免费版最低 600 秒,也就是最多等 10 分钟。如果你打算频繁调整解析,先把 TTL 调到最低值再改,改完稳定了再调回去。
顶级域名的坑:根域不能用 CNAME
DNS 规范规定根域(也叫 apex domain,就是 wflynn.cn 这种不带 www 的)不能有 CNAME 记录,因为根域必须有 SOA 和 NS 记录,而 CNAME 不允许和其它记录共存。
腾讯云、阿里云、Cloudflare 这些服务商用了各自的变通方案(DNSPod 叫「隐性 URL」或直接允许根域 CNAME,Cloudflare 叫 CNAME flattening),所以在这些平台上你确实能给根域填 CNAME,它们内部会在解析时展开成 A 记录返回。但如果你的 DNS 托管在不支持这个特性的服务商那里,根域就只能填 A 记录。
Vercel 给根域推荐的 A 记录是 76.76.21.21,而这个 IP 恰好是国内不通的那个。这就形成了一个死结:根域想走国内友好的解析,必须用支持 CNAME flattening 的 DNS 服务商。腾讯云 DNSPod 和 Cloudflare 都支持,所以这条路是通的。
我的实际配置是:
@(根域)→ CNAME →cname-china.vercel-dns.com.www→ CNAME →cname-china.vercel-dns.com.
然后在 Vercel 的 Project Settings → Domains 里把两个都加上,选一个做主域,另一个设 301 重定向到主域。两个域名都能访问但不做重定向的话,搜索引擎会当成两个站,权重被分散。
常见报错
Vercel 后台显示 Invalid Configuration。Vercel 会定期回查你的 DNS 记录是否符合它的预期值,改成 cname-china 之后它检测到的不是 cname.vercel-dns.com,就会标黄。这个警告可以忽略,域名照样能用——Vercel 的接入判断实际是看请求有没有带着正确的 Host 头进到它的边缘节点,而 cname-china 那组 IP 也是它自己的节点。
证书签发失败 / 浏览器报证书错误。Vercel 用 Let's Encrypt 自动签发证书,签发过程需要它能验证域名归属。如果你在 DNS 里配了 CAA 记录限制了签发机构,得把 Let's Encrypt 加进白名单:
wflynn.cn. CAA 0 issue "letsencrypt.org"
另一种情况是刚改完解析就访问,证书还在签发中,等几分钟即可。
改完还是间歇性打不开。cname-china 也不是万能的,它只是换了一组 IP,这组 IP 同样有被墙的可能,且不同省份、不同运营商的情况不一样。判断是不是这个原因,用多地 ping 的在线工具(站长工具、ITDOG 之类)看各省的丢包率,如果是部分地区不通就是 IP 层面的问题,跟你的配置无关。
更彻底的方案
如果博客的国内访问体验是硬需求,CNAME 换一组 IP 只是缓解,不是解决。往下有几条路,成本递增:
1. 前面套一层 Cloudflare。把域名的 NS 交给 Cloudflare,源站指向 Vercel,请求路径变成「用户 → Cloudflare 边缘 → Vercel」。Cloudflare 免费版在国内有一定可达性(走的是境外节点,但线路质量通常比直连 Vercel 好),而且能配缓存规则把静态资源缓在边缘,命中后连回源都省了。缺点是多一跳、Cloudflare 的国内节点也不稳定。
2. 静态资源分离到国内 OSS/CDN。博客的图片、字体、打包产物这些静态文件放到国内的对象存储(腾讯云 COS、阿里云 OSS)配 CDN,HTML 还走 Vercel。这样首屏 HTML 慢一点,但后续资源全部走国内节点,实际体感提升最明显。我的图片就是这么放的(wflynn.cn/res/img/... 走的独立路径)。
3. 直接迁到国内。域名备案 + 国内服务器或静态托管。这是唯一能做到「和访问国内站一样快」的方案,代价是备案流程和内容合规约束。
4. 双线部署。同一份代码同时部署到 Vercel 和国内节点,用 DNS 的智能解析(DNSPod 支持按线路分流)让国内 IP 解析到国内节点、海外 IP 解析到 Vercel。这是效果最好但维护成本最高的方案,需要处理两份部署的一致性。
我自己的取舍是方案 2:改 CNAME 保证 HTML 能打开,静态资源走国内 CDN 保证加载速度,不折腾备案。对个人技术博客这个投入产出比最合适。

还没有留言,来发表第一条吧~