3176 words
16 minutes
2026年,拥有自己的博客比以往任何时候都简单:Astro + Vercel + Cloudflare 实战(含所有踩坑记录)

上个周末,我把自己的博客从「挂在免费 GitHub 上」升级成了一个真正属于自己的网站:seanxlchen.com——自己的域名、自己的设计、完整的搜索/标签/中英双语。选型、换主题、迁移内容、买域名、配 DNS,全程大概一个小时

其中真正卡住我的,不是写代码(代码活几乎全交给了 AI),而是那些「按钮该点哪个」的配置问题 里的 Connect 和 Redirect 是什么区别?Cloudflare 那一排 Name / Type / Content / Proxy / TTL 到底各是什么?为什么 Cloudflare 明明是做代理起家的,接 Vercel 时反而要把代理关掉?

这篇文章把整个过程完整记录下来:我的选型和理由、每一个配置背后的原理,以及我踩过的每一个坑。它是写给想拥有个人博客的普通人的,不需要你会编程——过程中所有技术活都可以让 AI 代劳,你要做的只是打字、做选择、以及在网页上点对按钮。照着走一遍,你应该能比我更快。

为什么 2026 年了还要自己搭博客#

平台号(Medium、公众号、X)的问题老生常谈:算法决定分发、平台决定生死、内容不真正属于你。2026 年多了一层新理由:AI 时代,你的公开写作就是你的可检索身份。搜索引擎和 AI 助手在回答「Sean Chen 是谁」的时候,引用的是你能控制的域名,还是某个平台的碎片?

我的做法是 POSSE(Publish on Own Site, Syndicate Elsewhere):博客是所有内容的 canonical home,Medium、LinkedIn、X 只是分发渠道,每篇转载都带 canonical URL 指回博客。

而「自己搭」的成本,在 vibe coding 时代已经低到离谱。整个过程中我自己写的代码接近于零——选型调研、主题迁移、双语功能、DNS 排错,都是和 Claude 对话完成的。我真正做的事情是:做决定(选哪个主题、要什么功能、域名叫什么)和点按钮(登录各个平台完成 AI 够不着的操作)。这大概就是 2026 年个人项目的新常态:AI 负责「怎么做」,你负责「做什么」。

我的选型#

选择费用
站点框架Astro免费开源
博客主题Fuwari免费开源(MIT)
托管 + CDN + HTTPSVercel 免费档$0
域名注册 + DNSCloudflare Registrar$10.46/年

一年总成本:比一杯 Molly Tea 咸奶盖抹茶白兰贵一点点。 🥤 是的,你的独立数字身份,年费约等于一杯奶茶——而且奶茶喝完就没了,域名续费价永远锁在成本价。

为什么是 Astro#

Astro 是为内容网站而生的静态站点生成器:文章就是 Markdown 文件,构建时全部渲染成静态 HTML,默认几乎不往浏览器塞 JavaScript(它管这个叫 islands 架构)。对博客来说意味着:打开速度快、SEO 天然友好、内容以纯文本形式永远属于你。写作体验就是在编辑器里写 Markdown,没有后台、没有数据库。

对比过的选项:Next.js(全功能 React 框架,给内容站用是杀鸡用牛刀)、Hugo(构建更快但主题定制不如 Astro 灵活)、Hashnode/Substack(又回到平台号的老问题)。

为什么是 Fuwari#

Astro 官方的 blog 模板极简到寒酸:没有标签、没有搜索、没有暗色模式。我逛了一圈社区主题,发现它们大致分两派:

  • 欧美系极简派(AstroPaper、Cactus、Micro 这些):清一色黑白灰、纯文字流,工程师味很浓。功能没毛病,但挂自己的名字总觉得冷冰冰的,少了「个人博客」该有的那种柔和感
  • 视觉系(多出自中文/日文社区):卡片式布局、封面图、圆角、动画,一眼「这是个人的地方」

我最后选了视觉系里最成熟的 Fuwari(4700+ stars,中文社区作者) 全文搜索(中英文都能搜)、标签、分类、归档页、暗色模式、可调主题色、文章目录,全部开箱即带,颜值和功能难得两全。备选里还看过 Yukina(更漂亮但社区小,长期维护风险高)和一些多语言 fork(个人 fork 会跟不上原版更新,pass)。

多语言:轻方案胜过重方案#

我写中英双语。常见做法是整站 i18n 路由(/zh//en/ 两套页面),但那意味着每篇文章都欠一个翻译债——只有单语版本的文章会在另一套路由里开天窗。

我用了轻得多的方案:frontmatter 里加一个 translationKey 字段,中英两版共享同一个 key,文章页顶部自动出现「阅读中文版 / Read in English」按钮,顺便输出 hreflang 标签给搜索引擎。没有配对的文章什么都不显示,零负担:

---
title: "Making AI Customer Service Feel Human"
lang: en
translationKey: ai-customer-service-feel-human # 中文版填同样的 key
---

这个功能 Fuwari 没有自带,是让 Claude 在主题上加的——几十行代码,一次对话的事。同样方式还加了文章系列(series)功能和 canonical URL 支持。

整体架构:一图看懂谁在干什么#

博客整体架构 存内容,Vercel 构建+托管,Cloudflare 管域名

三个角色各司其职:

  1. GitHub 存内容——所有文章是 repo 里的 Markdown 文件,哪天 Vercel 倒了,换个托管商 10 分钟重新上线
  2. Cloudflare 管名字——域名所有权 + 全世界的「电话簿条目」:告诉浏览器 seanxlchen.com 的内容去 Vercel 找
  3. Vercel 管服务——构建、托管、CDN、HTTPS,全自动

日常更新流程简单到没有流程:写好 Markdown → git push → 一两分钟后全球生效。没有 FTP、没有服务器、没有「部署」这个动作。Vercel 监听着 GitHub repo 的 main 分支,每次 push 自动拉取、构建(包括重建搜索索引)、发布。

域名接线实录:每一个配置的意义 + 我踩的坑#

买域名很简单(Cloudflare 搜索、付款,两分钟)。把域名接到网站上才是新手墓地。下面按我踩坑的顺序讲。

坑 0:一次买几年?#

一年就够,开自动续费。Cloudflare 是成本价注册商,续费价 = 注册价,多买没有折扣。「域名注册年限长有利 SEO」是流传很广的谣言,Google 官方辟过谣。真正的风险是忘续费被抢注——解法是 auto-renew,不是预付十年。

坑 1:Vercel 里,Connect 还是 Redirect?#

在 Vercel 项目的 Domains 页面添加域名时,每个域名要二选一:

  • Connect to an environment (Production) = 这个域名直接服务网站
  • Redirect to Another Domain = 这个域名只是别名,访问它会跳去别处

规则其实一句话:主域名选 Connect,其余全是 308 Redirect 指向主域名。

我的配置:

域名配置
seanxlchen.comConnect → Production(主)
www.seanxlchen.com308 Redirect → seanxlchen.com

Vercel 域名最终配置

两个细节坑:

307 还是 308? 都是重定向,区别在「临时 vs 永久」。308 Permanent 告诉搜索引擎「记住新地址,权重也转移过去」;307 Temporary 则是「下次还来问我」。别名域名一律 308。

apex 还是 www 当主域名? Vercel 添加域名时默认勾选「Redirect apex domains to www (recommended)」,我一开始没注意,结果方向反了——变成裸域名跳 www。但我的站点配置(Astro 的 site 字段,决定 sitemap/RSS/hreflang 里的绝对链接)写的是不带 www 的裸域名。两边必须一致,所有 SEO 信号才会统一指向同一个规范 URL。我又回去把方向翻了过来。用哪个当主域名都行,关键是「选定一个,处处一致」。

Vercel 域名配置详情:主域名 Connect,www 308 跳转

坑 2:Cloudflare 那一排字段到底是什么#

配置完 Vercel,它会显示「Invalid Configuration」并给你一张表,让你去 DNS 服务商那里添加记录。这时你面对的是 Cloudflare 的 Add record 表单、Name、Content(Target)、Proxy status、TTL——每个字段展开讲:

一条 DNS 记录 = 「谁(Name)+ 什么类型的查询(Type)→ answer 是什么(Content)」,本质是全世界共享电话簿里的一行。

Name 是相对于你域名的前缀:

Name 填实际匹配
@seanxlchen.com 本身(约定俗成,@ 代表「根」)
wwwwww.seanxlchen.com

带不带 www 在 DNS 眼里是两个无关的名字,所以要各配一条——这也回答了「为什么要加两条记录」。

Type 决定这行规则回答什么问题:

Type回答的问题
A「这个名字的 IP 是多少?」→ 直接给 IP
CNAME「这个名字是谁的别名?」→ 给另一个域名,让你去问它
MX「这个域名的邮件送哪?」(博客用不到)
TXT验证文本(证明域名归属)

Vercel 让你用 CNAME 而不是 A 记录,是有讲究的 指向的是 Vercel 的一个中间名字(形如 xxxx.vercel-dns-017.com),Vercel 以后换 IP、扩容、调度,都在那个名字背后自己完成,你的 DNS 永远不用再动

Content/Target 就是答案本身。我在这里结结实实踩了一跤:

Content for CNAME record is invalid.

因为我填的是 https://blog-xxx.vercel.app/——一个网址。CNAME 的 target 必须是纯主机名:没有 https://(那是协议),没有结尾的 /(那是路径),而且填的应该是 Vercel 给的专用 DNS 接入点,不是你项目的 .vercel.app 地址。正确姿势是直接点 Vercel 表格里的复制按钮。

**TTL(Time To Live)**是这条记录允许被缓存多久。DNS 是层层缓存的体系(浏览器→系统→路由器→运营商),TTL 就是答案的保质期:太长,你改记录后全世界要等很久才看到新值;太短,缓存老失效、查询变多。选 Auto(Cloudflare 默认约 5 分钟)就好。

Cloudflare DNS 最终配置:两条 CNAME,灰云,Auto

坑 3(最反直觉的一个):为什么要关掉 Cloudflare 的 Proxy#

Cloudflare 的招牌功能就是橙色云朵——当你网站的代理,帮你挡攻击、做 CDN、上 HTTPS。DNS 页面还会弹黄色横幅劝你:“Proxying is required for most security and performance features”。

但接 Vercel 时必须选灰云(DNS only),这不是可选项。

原因是角色冲突 本身就是一个全功能边缘平台,自带全球 CDN、自动 HTTPS、DDoS 防护——橙云提供的所有好处,Vercel 已经内置了。开着橙云变成两个中间人打架:

  1. HTTPS 证书签发直接卡死(最致命)。Vercel 给你的域名自动签发证书前,要验证「这个域名的流量确实到我这里」。橙云开着,验证请求被 Cloudflare 拦截,永远到不了 Vercel → 证书签不出来 → 域名状态永远 Invalid
  2. 重定向死循环风险。Cloudflare 某些 SSL 模式用 HTTP 回源,Vercel 收到又跳 HTTPS,浏览器最终报 TOO_MANY_REDIRECTS
  3. 双层缓存。你更新了文章,Vercel 刷新了,Cloudflare 还存着旧版,排查噩梦

一句话:托管在 Vercel/Netlify 这类平台上时,Cloudflare 的正确角色是纯注册商 + 纯电话簿。 那条黄色横幅,自信地无视它。

坑 4:配好了却打不开?可能是「负缓存」#

DNS 记录保存后,我用 dig 查已经解析成功,但浏览器(和 curl)还是报「无法解析主机」。这不是配错了——是我这台电脑在几分钟前查询过这个域名,当时它还不存在,于是系统把**「查无此名」这个答案也缓存了下来**(negative caching)。

处理方式:等几分钟自然过期,或者换无痕窗口/另一台设备验证。判断标准很简单:dig 能解析 = 配置已生效,剩下的只是各级缓存在陆续过期。

验证清单#

全部配完后,值得逐项确认:

  • https://你的域名 返回 200,证书有效(浏览器锁图标)
  • https://www.你的域名 308 跳转到主域名
  • 站内搜索能用(搜索索引只在构建时生成,本地 dev 模式搜不了是正常的)
  • RSS(/rss.xml)里的链接是正式域名
  • 随便改篇文章 push 一下,一两分钟后线上更新

写在最后#

复盘这一个小时,我自己写代码的时间约等于零。剩下的是:和 AI 讨论选型、在几个 demo 站之间做审美决策、登录各平台点按钮、以及在踩坑时问「为什么」——而每个「为什么」的答案,都变成了这篇文章的一节。

2026 年搭博客的真实门槛已经不是技术了,是开始写。基础设施一个小时就能好,内容才是那个需要长期主义的部分。

这个博客会同时写工程(LLM、RAG、AI-native 开发)和生活(投资、随笔)。如果这篇对你有用,欢迎来 seanxlchen.com 逛逛。