上个周末,我把自己的博客从「挂在免费 GitHub 上」升级成了一个真正属于自己的网站:seanxlchen.com——自己的域名、自己的设计、完整的搜索/标签/中英双语。选型、换主题、迁移内容、买域名、配 DNS,全程大概一个小时。
其中真正卡住我的,不是写代码(代码活几乎全交给了 AI),而是那些「按钮该点哪个」的配置问题
这篇文章把整个过程完整记录下来:我的选型和理由、每一个配置背后的原理,以及我踩过的每一个坑。它是写给想拥有个人博客的普通人的,不需要你会编程——过程中所有技术活都可以让 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 + HTTPS | Vercel 免费档 | $0 |
| 域名注册 + DNS | Cloudflare 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,中文社区作者)
多语言:轻方案胜过重方案
我写中英双语。常见做法是整站 i18n 路由(/zh/、/en/ 两套页面),但那意味着每篇文章都欠一个翻译债——只有单语版本的文章会在另一套路由里开天窗。
我用了轻得多的方案:frontmatter 里加一个 translationKey 字段,中英两版共享同一个 key,文章页顶部自动出现「阅读中文版 / Read in English」按钮,顺便输出 hreflang 标签给搜索引擎。没有配对的文章什么都不显示,零负担:
---title: "Making AI Customer Service Feel Human"lang: entranslationKey: ai-customer-service-feel-human # 中文版填同样的 key---这个功能 Fuwari 没有自带,是让 Claude 在主题上加的——几十行代码,一次对话的事。同样方式还加了文章系列(series)功能和 canonical URL 支持。
整体架构:一图看懂谁在干什么
三个角色各司其职:
- GitHub 存内容——所有文章是 repo 里的 Markdown 文件,哪天 Vercel 倒了,换个托管商 10 分钟重新上线
- Cloudflare 管名字——域名所有权 + 全世界的「电话簿条目」:告诉浏览器 seanxlchen.com 的内容去 Vercel 找
- 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.com | Connect → Production(主) |
www.seanxlchen.com | 308 Redirect → seanxlchen.com |

两个细节坑:
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。我又回去把方向翻了过来。用哪个当主域名都行,关键是「选定一个,处处一致」。

坑 2:Cloudflare 那一排字段到底是什么
配置完 Vercel,它会显示「Invalid Configuration」并给你一张表,让你去 DNS 服务商那里添加记录。这时你面对的是 Cloudflare 的 Add record 表单
一条 DNS 记录 = 「谁(Name)+ 什么类型的查询(Type)→ answer 是什么(Content)」,本质是全世界共享电话簿里的一行。
Name 是相对于你域名的前缀:
| Name 填 | 实际匹配 |
|---|---|
@ | seanxlchen.com 本身(约定俗成,@ 代表「根」) |
www | www.seanxlchen.com |
带不带 www 在 DNS 眼里是两个无关的名字,所以要各配一条——这也回答了「为什么要加两条记录」。
Type 决定这行规则回答什么问题:
| Type | 回答的问题 |
|---|---|
| A | 「这个名字的 IP 是多少?」→ 直接给 IP |
| CNAME | 「这个名字是谁的别名?」→ 给另一个域名,让你去问它 |
| MX | 「这个域名的邮件送哪?」(博客用不到) |
| TXT | 验证文本(证明域名归属) |
Vercel 让你用 CNAME 而不是 A 记录,是有讲究的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 分钟)就好。

坑 3(最反直觉的一个):为什么要关掉 Cloudflare 的 Proxy
Cloudflare 的招牌功能就是橙色云朵——当你网站的代理,帮你挡攻击、做 CDN、上 HTTPS。DNS 页面还会弹黄色横幅劝你:“Proxying is required for most security and performance features”。
但接 Vercel 时必须选灰云(DNS only),这不是可选项。
原因是角色冲突
- HTTPS 证书签发直接卡死(最致命)。Vercel 给你的域名自动签发证书前,要验证「这个域名的流量确实到我这里」。橙云开着,验证请求被 Cloudflare 拦截,永远到不了 Vercel → 证书签不出来 → 域名状态永远 Invalid
- 重定向死循环风险。Cloudflare 某些 SSL 模式用 HTTP 回源,Vercel 收到又跳 HTTPS,浏览器最终报 TOO_MANY_REDIRECTS
- 双层缓存。你更新了文章,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 逛逛。