第七次,你好,世界。
原标题:《因为一个 PHP 漏洞,我给博客搬了家》,作者:Claude Opus 5.5
10 月 21 日,PHP 官方修了两个漏洞:CVE-2026-109618 和 CVE-2026-109619,圈里把这组漏洞叫 PHP2Shell。不用登录,发几个特制的上传请求,就能在服务器上执行代码。
我第一反应是去看博客那台服务器。
一台我已经忘了装过什么的服务器
让 Claude Code 上去看了一圈,结果不太好看:PHP 是 2020 年 3 月自己编译的 7.4.3,这个大版本早就停止维护,官方不会再出补丁;系统是 Debian 9,也停止维护了;漏洞依赖的 session.upload_progress 默认开着。翻了下日志,4 天里有 1713 次针对 wp-login.php 的爆破请求。
更尴尬的是,这台机器上到底跑着什么,我自己已经说不清了。
盘点下来:nginx 里配了十几个站点,一大半的域名早就没有解析;主页 r-ay.cn 其实很早就放到了对象存储上,服务器上那份只是个过期的副本;我自己的东西里,还在用这台服务器的只剩这个博客。
而博客本身,8 年攒下 10 篇文章,近一年只有 1 条真实评论,待审核的 19 条全是垃圾广告。为了这 10 篇文章,我常年养着一台 PHP 服务器、一个云数据库,外加防火墙插件和对象存储同步插件。
本来想重装服务器,最后只搬走了博客
一开始的打算是把服务器清空重装,焕发新春。
查记录的时候发现,朋友今年三月还上去改过 php-fpm 的配置,四月、七月也都登录过。这台机器他还在用。重装会把他的东西一起抹掉,所以改了主意:只把博客搬走,服务器留给它现在的主人。
博客换成静态站,评论留着
博客换成了 Astro,主题用 Retypeset。10 篇文章转成 Markdown,旧链接 /articles/{id}-{slug} 保持不变,以前收藏过的地址还能打开。
迁移时顺手修了几处老毛病:
- 在 WordPress 里,我一直用引用块当小标题,这次统一转成了二级标题,文章也因此有了目录。
- 图片全部换回原图,构建时再压缩。九月 Xing 在《近况》下面说网络拓扑图被压到 1024×417 看不清,这回清楚了。
- 《拣爱》里那几句白色的「隐藏内容」,深色模式下会直接露馅,改成了鼠标悬停才显示的模糊遮罩。
评论我想留着,这也是我能忍受那么多垃圾评论的原因。选评论系统时有个小插曲:AI 一开始说「只有 Artalk 能导入 WordPress 的旧评论」。可总共就 17 条评论,写个脚本就能迁,选型应该看哪个维护得好、用起来顺手。最后选了 Waline,访客不用注册,留个昵称就能评论。16 条旧评论连同回复关系一起迁了过来,另一条是 WordPress 安装时自带的示例评论。
主页改了三版,最后删到只剩几样东西
第一版主页和博客都照着毕设官网 bitego.net 的手绘风做,奶油色的纸、霞鹜文楷、铅笔描边。做完一看,主页和官网太像了,博客用暖色底,读长文也累。博客后来换成了冷白底和系统字体。
第二版换了个思路:让三个 subagent 各自从「前端工程师」「Agent 视角」「完全不设限」出发做原型。一个是能按快捷键「审查」的主页,一个是写给 Agent 看的协作者上下文,一个是十三圈年轮配年表。都挺有意思,但都太复杂了,信息也给得太多,没必要把这么多东西摆给陌生人看。
最后留下的是这样:

头像外面是年轮,从 2014 年开始一年一圈,今年这一圈只画到今天。下面是手写签名,再下面是我的业余无线电呼号 BH4HPA 和它的摩尔斯电码。年轮每隔几秒会从里往外亮一遍,像电台在发信号;页面还照着真实电报的节奏,一遍遍拍发这个呼号。
主页上关于博客的,只剩一行「最近在写」,构建时自动取最新的一篇。
AI 导读要勾人,不能剧透
每篇文章顶上加了一段 AI 导读。第一版写得像摘要,《近况》那篇直接把结尾的答案写了出来,读者看完导读,文章就不用读了。改成先把问题抛出来,答案留在正文里。
导读存在仓库里,构建时不调用模型。文章改了而导读没跟着改,构建会给出提醒。
推一下代码,网站自己就更新
现在文章写好推到 GitHub,Actions 就会构建博客和主页,再同步到腾讯云的对象存储,前面挂 CDN。评论服务用 Docker 跑在另一台服务器上,也挂在 CDN 后面。
切换按 www、博客、主页的顺序一步步来,每一步都能往回退。中间也踩了坑:腾讯云 CDN 的 URL 重定向只在源站是 IP 时生效,www 怎么都跳不到 r-ay.cn。最后没再较劲,让 www 和 r-ay.cn 回源同一个存储桶,内容一样就行。
收尾的时候,顺着「哪些东西还连着那台老服务器」往下查,发现旧 WordPress 的数据库里还存着一把对象存储的密钥,能读写整个账号下的所有存储桶。老服务器一旦被攻破,这把钥匙就会落到别人手里。博客已经用不到它了,直接停用。现在 CI 用的是一个专门的子账号,只能写博客和主页这两个存储桶。
和 AI 一起干这件事的几点体会
这次几乎所有的活,都是我和 Claude Code 一起干的。回头看,我说得最多的,是「这个方向不对」:
- 「干脆就只做博客的迁移,这台服务器继续烂在这」
- 「我希望你挑一个维护性最好最合适的评论系统,至于迁移评论完全可以你来做」
- 「三个主页都太复杂了,信息太多,没必要漏这么多信息给别人吧」
- 「我希望 AI 导读是起到一个吸引读者阅读兴趣的作用」
- 「其实也不需要钻牛角尖」
后 Agent Coding 时代,执行力、代码编写速度不再成为瓶颈,程序员或者 AI 使用者最重要的就是判断力:能定方向、能拍板,能一眼看出问题,让 AI 不钻牛角尖、不在一个问题上重复打转。当然,快速学习的能力和刨根问底的能力也很重要。后者会驱使你去了解为什么是这样,前者则帮助你知道为什么。
这次就有一个现成的例子。AI 说国内拉 Docker 镜像大概率不通,就去找镜像站,可那台服务器上明明有代理。被我点出来以后,它先实测,再换了一种不用重启 Docker 的方式拉镜像。
还有个办法,是让不同的模型互相挑错。改完代码后交给 codex 做了一次盲审,它抓出来 RSS 里中文文件名的图片地址全是坏的,还有重复导入评论会把新回复的父子关系弄断。这些我自己翻代码,大概率看不出来。
还有一条小规矩:代码里不写注释。需要说明的写进 README,代码不是我们俩之间的文档。
2018 年那次重建,第一篇文章叫《第六次,你好,世界。》。这次算是第七次了。