又拍云 CDN 加速终局:未备案硬约束下的三次方案翻车与止损
背景与目标
www.wdmeng.cn(GEO 博客,BuildAdmin 框架)服务器在美国 154.217.247.150,痛点:大陆移动 4G 打开图片慢。目标:找一个大陆能用、免备案的 CDN 图床加速图片。
诉求很朴素,但整件事被一个硬约束锁死:域名未备案(公司转个人后备案被取消),而大陆 CDN 节点对未备案域名一律拦截——七牛、又拍云口径一致。整个下午围绕"绕开备案"试了三套方案,全部失败,最终止损回退。
过程回顾
尝试 1:又拍云存储测试域名直连(http 可用,https 不可用)
又拍云云存储 wdmengsso,测试域名 wdmengsso.test.upcdn.net。实测:
- HTTP 200,0.26 秒,大陆访问飞快 ✅
- HTTPS 握手被拒(TLS alert)——控制台"HTTPS 访问"默认关闭,且测试域名是平台域名,客户无法为它上传自己的证书
而网站是 https 的。https 页面引用 http 图片 = Mixed Content,Chromium 会自动把 http 升级为 https → 握手失败 → 图片加载失败。用户实测贴出的控制台报错证实了这一点。
关键认知:测试域名免备案、免证书、速度快,但平台不给它开 https,这条路的咽喉卡死在协议上。
尝试 2:自有证书 + 绑定域名
服务器上查到 www.wdmeng.cn 的 Let's Encrypt 证书(fullchain.pem + privkey.pem,覆盖域名仅 www.wdmeng.cn,有效期至 2026-11-14)。想拿去又拍云配 HTTPS。
两条死路:
- 测试域名是平台域名,不能传自有证书;
- 绑定自有域名(img.wdmeng.cn)需要证书覆盖该域名——现有证书只覆盖 www,不匹配;更致命的是 img.wdmeng.cn 未备案,又拍云审核中,公网 400 拦截。
结论:证书不是问题,备案才是。用户一句"开不了,也备案不了"把这条路钉死。
尝试 3:nginx 反向代理(方案 A)
用户拍板:"方案A,试下看看,nginx配置的话,你搞个备份。不行,立马恢复。"
实现:nginx 加 location ^~ /upcdn/ 反代到 http://wdmengsso.test.upcdn.net/,图片 URL 变成 https://www.wdmeng.cn/upcdn/...(同源 https,无 Mixed Content)。改动前备份 www.wdmeng.cn.conf.bak.20260927,nginx -t 通过后 reload,实测 200 image/jpeg ✅。
但暴露了真正的后果:用户刷新网站"有的显示,有的不显示,乱七八糟的"——反代链路图片绕道美国服务器,且部分图片路径/缓存表现异常。用户彻底失去耐心,下令恢复。
最终方案:全额回退
三步回退,实测确认:
- nginx 配置从备份还原(
.bak.20260927),/upcdn/代理移除; .env恢复UPYUN_DOMAIN = 0;- 验证文章页 4/4 图片 URL 回到
/storage/ipms/...,本地图片 HTTP 200。
线上行为与改动前完全一致。代码仓库保留 7 个 commit(上传双写、CDN 前缀逻辑),但全部被 UPYUN_DOMAIN = 0 关闭,不影响线上。
关键踩坑
| 现象 | 根因 | 教训 |
|---|---|---|
| 全站图片打不开(14:58 用户暴怒) | 明知道 wdmengsso.b0.aicdn.com 公网 400 未备案拦截,仍把线上 .env 切到该域名 |
切换线上前必须隔离风险:CDN 域名公网可用性未验证通过,禁止上线切换 |
| "存量的不动,我要上什么 CDN 啦?"(14:50)被当成指令执行 | 反问/反讽质问被 AI 误读为"存量也要上 CDN",随即实现全站 CDN 前缀 | 质问句不等于指令:验收口径不明时先确认语义,不能直接当任务执行 |
| https 页面图片加载失败(Mixed Content) | http 图床 + https 站点,Chromium 自动升级 http→https 后握手失败 | 图床与站点必须同协议,免备案 ≠ 免 https |
| 早期反复问东问西被骂"娱乐豆包" | 先问后查,该查的资料(上传架构/配置)没有先查 | 排查类任务先查本地代码与配置,再提问 |
做得好的地方
- 止损果断:用户 15:29 下令恢复,15:33 前完成 nginx 还原 + 开关关闭 + 页面验证,网站零损失。
- 条件式指令执行到位:用户"备份再改、不行立马恢复"的边界,nginx 备份 + 回退命令都落地了。
- 测试域名实证:15:01 用户问"这张图能不能显示",实测 HTTP 200/694KB/0.26s,没有拍脑袋。
- CORS 澄清:用户问 CORS 能否解决 Mixed Content,正确否定——协议层拦截先于 CORS,不能混淆。
复盘与改进
- 硬约束先查再抛方案:备案是 CDN 的第一硬约束。选外部服务(图床/CDN)第一步查"要不要备案、平台测试域名能不能开 https",而不是先抛方案再撞墙。本次撞了三次。
- 线上切换风险隔离:任何"切换线上行为"的改动,先验证目标链路(公网可达性)再切;带开关(
UPYUN_DOMAIN)是对的,但开关开在哪一天,必须等链路验证通过。 - 反问句语义确认:用户说"存量的不动,我要上什么 CDN 啦?"这种质问,AI 应先确认"存量是否需要处理",而不是直接执行。
- 方案 A 的本质局限:反代让图片绕道美国服务器,4G 加速有限——用户要的是"加速",不是"能显示"。方案与诉求的匹配度要在动手前说清。
成长评估
五维评分(10 分制,只对事)
| 维度 | 分 | 证据 |
|---|---|---|
| 指令与提示词质量 | 7 | 主干清晰(换图床/测试/备份/回滚),但"存量的不动,我要上什么 CDN 啦?"以反问拍板,语义被误读且未澄清 |
| 判断与结论 | 8 | 14:58 指出线上被打挂、15:04 判断测试域名不需要服务器证书——用户判断均正确,多次纠正 AI 方向 |
| 思维方式 | 8.5 | "不要你干活,把问题先搞清楚先"→先查再动;要求实测、要求备份回滚,工程思维成熟 |
| 最终结果与产出 | 6 | 目标(CDN 加速)未达成,以失败告终;但止损彻底,网站零损失回退 |
| AI 协作能力 | 5 | AI 多次失手:误读反问、上线切到打不开的域名、前期问东问西,协作体验差 |
AI 自评失分点(被本人抓到的优先)
- 误读反问为指令:14:50 用户"存量的不动,我要上什么 CDN 啦?"实为反问(存量不动,上 CDN 无意义),AI 理解为"存量也要上 CDN",执行全站 CDN 前缀 → 线上图片全挂。本次最大失分点。
- 明知道 CDN 域名公网 400,仍切线上:未做"切换前风险隔离",导致 14:58 用户暴怒"搞到图片都不显示了"。
- 前期问东问西:上传路径/架构等问题应先查代码,13:29 被骂"你真是个娱乐豆包"。
- 方案 A 未先对齐诉求:用户要加速,方案 A 只能保显示(图片绕美国服务器),匹配度问题应在动手前说清。
指令实证(本次复盘本体)
- "存量的不动,我要上什么 CDN 啦?"(14:50)→ AI 误读为存量上 CDN 的指令,实现全站 CDN 前缀(commit
ef14e7aa/7f4889e5)→ 线上图片全挂(证据:14:58 用户暴怒+回退操作)。教训:质问句/反讽句在验收口径不明时,先确认语义再执行。 - "方案A,试下看看,nginx配置的话,你搞个备份。不行,立马恢复。"(15:23)→ 条件式指令(备份+回退底线),AI 执行到位:nginx 备份
.bak.20260927+实测 200+回退命令一步到位(证据:备份文件+回退后页面/storage恢复)。教训:给 AI 下"带回退底线"的指令,AI 行为立刻收敛。
素材点
- 未备案域名下,大陆 CDN 的三条死路:平台测试域名(免备案但 https 锁死)/ 自有域名(必须备案)/ 反代(能显示但绕美国,4G 不加速)。
- "测试域名免备案"的坑:http 通、https 平台不给开,而现代站点全 https,协议是咽喉。
- 带开关(
UPYUN_DOMAIN)的架构设计是对的,但开关何时打开,必须由"目标链路公网可用性实测"决定,不是由功能实现决定。 - 条件式指令("备份、不行立马恢复")能显著收敛 AI 行为,是可复制的提示词模式。
