Vercel 内容站上线清单(10 项检查)

截至 2026 年 6 月,Vercel 内容站上线前的 10 项检查——base URL、环境变量、www 与 apex 的 DNS、SSL、分析额度、sitemap、漏出的 vercel.app 扫描、即时回滚和花费上限。

把真实域名指到 Vercel 部署之前,先过一遍这 10 项检查。每一项都对应着某个独立开发者真的推到过生产环境的失误:canonical 还指着 *.vercel.app、secret 漏进了 PUBLIC_ 前缀的变量、sitemap 提交到了错的主机名、回滚没演练过,或者一个商用站点一直跑在免费的 Hobby 计划上(而 Vercel 只把 Hobby 授权给个人非商用项目)。每项检查都用不了 5 分钟。漏掉一项,“上线日”就可能变成”回滚加道歉日”。

一句话总结

  • 设好真实的 base URL(Astro 用 site:,Next.js 用 metadataBase),这样 canonical 和 Open Graph 标签就永远不会写出 *.vercel.app 的主机名。
  • www 和 apex 里选一个做主域,两个都加进项目,另一个用 308 跳转过去。截至 2026 年 6 月,Vercel 发给你的是项目专属的 CNAME(形如 xxxx.vercel-dns-017.com),所以一定要从自己的控制台复制那个值。
  • 审一遍 Production 环境变量,看有没有 secret 躺在 PUBLIC_ / NEXT_PUBLIC_ 名字里——这些会打进浏览器端的包。
  • 上线前就把免费额度的天花板记清楚:Hobby 上 Web Analytics 上限是每月 2,500 个事件,Speed Insights 是每月 10,000 个数据点
  • 在流量到来之前先演练 vercel rollback、先打开 Spend Management,而不是等出事时现学。

为什么上线本身是一项独立的活

Vercel 的默认值几分钟就能把项目跑起来,但上线是另一回事:这是你锁定主域名、环境 secret、SEO 暴露面、分析额度和应急方案的时刻。下面这份清单按执行顺序写,从上到下做——因为第 1 步(base URL)会决定第 8 步(扫描漏出的主机名)到底在找什么。

10 项检查

1. 确认 base URL

Astro 在 astro.config.mjs 里设 site:;Next.js 在 app/layout.tsx 里设 metadataBase。必须是自定义域名,绝不能是 *.vercel.app——这一个值会喂给 canonical 标签、sitemap 和 og:url

// astro.config.mjs
export default defineConfig({
  site: 'https://yourdomain.com',
  trailingSlash: 'always',
});
// app/layout.tsx (Next.js)
import type { Metadata } from 'next';
export const metadata: Metadata = {
  metadataBase: new URL('https://yourdomain.com'),
  alternates: { canonical: '/' },
};

2. 审计 Production 环境变量

列出 Production 变量,grep 一下有没有 secret 误放进了浏览器可见的名字里。任何 NEXT_PUBLIC_(Next.js)或 PUBLIC_(Astro)前缀的变量都会被内联进客户端包。

vercel env ls production

# 确认真正的 secret 不在公开前缀变量里
vercel env ls production | grep -E 'NEXT_PUBLIC_|PUBLIC_'
# 在这里看到 STRIPE_SECRET / API_KEY,就是把 secret 漏给了每一个浏览器

3. 两个域都加上,指定一个做主

先定 www 还是 apex 做主域(Vercel 文档现在推荐用 www 以获得最稳的配置),把两个都加进项目,再把非主域用永久 308 跳转过去。

{
  "redirects": [
    { "source": "/:path*", "has": [{ "type": "host", "value": "www.yourdomain.com" }],
      "destination": "https://yourdomain.com/:path*", "permanent": true }
  ]
}

apex 做主时的 DNS。apex 的 A 记录是 Vercel 的 anycast IP 76.76.21.21,但 www 的 CNAME 截至 2026 年 6 月已经是项目专属的——从控制台复制确切的值,别再用旧的通用 cname.vercel-dns.com

Type   Name   Value
A      @      76.76.21.21
CNAME  www    <从 Vercel 复制,例如 d1d4fc829fe7bc7c.vercel-dns-017.com>
# 打印出 Vercel 为你的域名给出的确切 DNS 记录
vercel domains inspect yourdomain.com

4. 两个主机名都验 SSL

curl -sI https://yourdomain.com     | head -1   # HTTP/2 200
curl -sI https://www.yourdomain.com | head -3   # HTTP/2 308 + location: https://yourdomain.com/

Vercel 会给每个加进来的域名自动签发 Let’s Encrypt 证书,但只有在 DNS 解析生效后才会签——所以这一步要等记录传播完再做,别提前做。

5. 开分析——并记清免费额度

在 Project → Analytics → Enable 里打开 Web Analytics 和 Speed Insights,或者用 SDK 做更细的控制。提前把 Hobby 的额度天花板算进预算(见下表),免得上线到一半采集被悄悄暂停。

npm install @vercel/analytics @vercel/speed-insights
// app/layout.tsx
import { Analytics } from '@vercel/analytics/react';
import { SpeedInsights } from '@vercel/speed-insights/next';

export default function RootLayout({ children }) {
  return <html><body>{children}<Analytics /><SpeedInsights /></body></html>;
}

6. 对线上 URL 跑 Lighthouse

目标是 Performance 和 Best Practices 都过 90。跑在 Vercel CDN 上的静态 Astro 或预渲染的 Next.js 内容站应该轻松过线;要是没过,多半是首屏大图太大,或者有阻塞渲染的字体。

npx lighthouse https://yourdomain.com/ \
  --only-categories=performance,seo,best-practices \
  --chrome-flags="--headless" --quiet

7. 把主域名提交到 Search Console

用 Domain property——它一次覆盖 http/https 和所有子域——并用 DNS TXT 记录验证(比一次重新部署就可能丢掉的 HTML 标签更耐用)。

Search Console → Add property → Domain → yourdomain.com
在 apex 加 DNS TXT 记录:
  Name: @       Value: google-site-verification=[token]
再 Sitemaps → Add → https://yourdomain.com/sitemap.xml

8. 扫线上 HTML 有没有漏出 vercel.app URL

curl -s https://yourdomain.com/ | grep -iE 'vercel\.app|canonical|og:url' | head
# canonical / og:url 必须是 yourdomain.com,绝不能是 *.vercel.app

如果这里还有东西解析到 *.vercel.app,回到第 1 步——你的 base URL 没生效。

9. 演练一次即时回滚

别等到出故障时才现学命令。截至 2026 年 6 月,Vercel 有专门的 vercel rollback;在 Hobby 上你只能回滚到紧挨着的上一个生产部署,Pro 才能回滚到更早的任意一个。

vercel ls                         # 找到你要回退到的那个部署
vercel rollback                   # 回滚到上一个生产部署
vercel rollback [deployment-url]  # Pro:回滚到指定的某个更早部署
vercel rollback status            # 确认是否完成
vercel promote [deployment-url]   # 撤销回滚 / 重新提升

控制台里同样的操作在 Deployments → ⋯ → Instant Rollback。注意:只有之前别名到过生产域名的部署才有资格回滚——大多数一次性的 preview 构建不行。

10. 打开 Spend Management

新团队默认带一个 200 美元的按量预算。在 Pro 上,把 Spend Management 配成到硬上限时暂停项目,并在中间阈值发告警——没有这个,一次流量高峰或一个配错的函数就能在你察觉之前把用量跑上去。

Settings → Billing → Spend Management → 设硬上限
加通知阈值(例如 50% 和 90%)
Pro:打开"暂停项目",让花费到上限就停

需要提前规划的免费额度天花板(截至 2026 年 6 月)

Hobby 计划是真免费、永不超额收费——它的做法是暂停采集,或者直接把站点下线。对副项目没问题,但对任何商用项目就是个坑,而 Vercel 的条款要求商用项目必须上 Pro。

项目Hobby(免费)Pro(20 美元/席位/月)
商业用途不允许允许
Web Analytics 事件每月 2,500,之后暂停超出包含额度按量计费
Speed Insights1 个项目,每月 10,000 数据点,7 天窗口每项目 10 美元基础费,30 天窗口
即时回滚仅上一个部署任意更早部署
每项目自定义域名5050
Spend Management 自动暂停

如果你的内容站要卖东西、跑广告,或者代表一家公司,就计划上线即上 Pro——边界划在哪,见Vercel Hobby 与 Pro 怎么选

容易踩的坑

  • canonical / sitemap / social meta 里还留着 *.vercel.app——通常是因为第 1 步的 base URL 根本没设。
  • sitemap 交到了非主域;Search Console 把 www 和 apex 当成两个独立 property,会把你的数据拆开。
  • 粘了旧的通用 cname.vercel-dns.com,而不是 Vercel 现在发的项目专属 CNAME——域名会一直卡在 “Invalid Configuration”。
  • 周五下午上线;尽量挪到一周早些时候,好留出时间用上你演练过的回滚。
  • 跳过环境变量审计,结果上线后第一个生产请求就到处 undefined
  • 商用站跑在 Hobby 上,月中免费额度一触发就被下线。

FAQ

  • 整个清单要多久?: 第一次大概 30-45 分钟。第二个项目就降到 10 分钟左右,因为 vercel.json、DNS 记录和分析接入都成了可复用的模板。
  • www 还是 apex 做主域?: 都行,选一个、把另一个跳转过去。Vercel 现行文档偏向用 www 做主,因为以后在前面加 CDN 或边缘层更容易。无论选哪个,base URL、sitemap 和 Search Console 要保持一致。
  • 旧教程里的 www CNAME 不管用,为什么?: Vercel 改成了每项目专属的 CNAME 主机名(形如 xxxx.vercel-dns-017.com)。跑 vercel domains inspect yourdomain.com 或从控制台读出来;通用的 cname.vercel-dns.com 已经不是要复制的那个值了。
  • 上线后马上发现 404 怎么办?: 先查跳转规则和 cleanUrls / trailingSlash 的相互作用——Astro 的 trailingSlash: 'always' 和 Vercel 的链接处理对不上是常见原因。如果是大面积的,跑 vercel rollback,到 preview 上调试。
  • 要上 uptime 监控吗?: 至少接一个免费监控(UptimeRobot 或 BetterStack 免费档)每 5 分钟打一次 /,让你比读者更早知道出了事。

相关阅读

标签: #独立开发 #Vercel #部署 / 托管 #工作流 #SEO