设为首页收藏本站

ZMX - IT技术交流论坛 - 无限Perfect,追求梦想 - itzmx.com

 找回密码
 注册论坛

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

用百度帐号登录

只需两步,快速登录

搜索
查看: 30|回复: 1

kangle关于 cdn 缓存的几种坑,随机多域名固定重写共用

[复制链接]

签到天数: 129 天

[LV.7]常住居民III

发表于 2026/1/14 16:02 | 显示全部楼层 |阅读模式
天涯海角搜一下: 百度 谷歌 360 搜狗 有道 雅虎 必应 即刻
因为 “缓存是按 URL(通常包含 Host)分桶的”。

我现在的域名是 * 泛解析 通配符的,前端每次刷新,可能请求资源的域名是 1.test.com 2.test.com 3.test.com 这种随机的二级主机域名
在 CDN/Kangle 眼里,这就是一条全新的 URL 空间,所以第一次一定是 MISS,第二次(同一个子域名再访问)才会 HIT。你刚才 curl 两次就验证了这一点:第一次 MISS,第二次 HIT。

同时还有两个“必然一起发生”的点:

1) CDN/Kangle 的缓存 key 通常包含 Host

大多数缓存默认是:cache_key = scheme + host + uri (+ query)
所以:

https://a.xxx.com/path/poster2.jpg

https://b.xxx.com/path/poster2.jpg
哪怕回源同一份文件,也会被当成两份不同缓存对象。

2) 浏览器缓存也不跨域复用

就算文件内容完全一样,换子域名后浏览器也会当成新站点资源,不会直接复用之前域名的本地缓存(同源策略的直觉结果)。

你想要“换子域名也不 MISS”,只有这几种路
方案 A(最稳、最省事):别换子域名,用一个固定静态域名

比如只用:
img.ydyimgsbafa134.sbs/...
然后你想怎么更新内容就更新内容,缓存命中会稳定很多。

方案 B:让所有子域名 301 到一个固定域名

用户访问任意 *.sbs 最终都跳到 img.xxx.sbs,缓存也就集中起来了。

方案 C(有风险):在 Kangle/CDN 里把缓存 key 改成“不包含 Host”

这样不同子域名会共享同一份缓存。

✅ 命中率会飙升

⚠️ 风险是:如果不同子域名未来可能出现“同路径不同内容”,会串缓存(非常坑)

方案 D:预热(warm up)

你每生成一个新子域名,就脚本 curl 一遍热门资源,把它“主动打热”,用户看到的就会更少 MISS。
===================
问题来了
如何 在 Kangle/CDN 里把缓存 key 改成“不包含 Host”
因为一台cdn节点 使用了 3个不同的根域名缓存了不同的源服务器的资料
怎样配置kangle规则呢
实下如下例子
---------------
站1的资源url
1.z1.com/xxx/x.gif
2.z1.com/xxx/x.gif
3.z1.com/xxx/x.gif
无限随机
-----------
1.z2.com/xxx/x.gif
2.z2.com/xxx/x.gif
3.z2.com/xxx/x.gif
同上
-----------
1.z3.com/xxx/x.gif
2.z3.com/xxx/x.gif
3.z3.com/xxx/x.gif
同上
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复

使用道具 举报

 成长值: 417

签到天数: 5125 天

[LV.Master]伴坛终老

发表于 2026/1/14 18:56 | 显示全部楼层 |Google Chrome 143.0.0.0|Windows 10
和你咨询ai说的一样
kangle能够实现的是请求控制中的remove_param标记模块,用于删除?之后的参数
例如你提到的方案改成如下
  1. www.z1.com/xxx/x.gif?host=1
  2. www.z1.com/xxx/x.gif?host=3
  3. www.z1.com/xxx/x.gif?host=3
复制代码


同时就算通过上方删除参数的形式hit缓存了,浏览器用户本地端也不会认可这种缓存,会反复重复请求服务器去获取新资源

还有一种可行的思路提供
使用url_rewrite标记模块重写
匹配url
  1. [0-9]+\.z1\.com/(.*)$
复制代码

重写dst
  1. https://att.z1.com/$1
复制代码


重写结果如下,这样服务器会始终hit到att的缓存,并且浏览器也会始终认可这个缓存结果无需和服务器进行后续请求
1.z1.com/forum/data/image.jpg → att.z1.com/forum/data/image.jpg
2.z1.com/avatar/001.gif → att.z1.com/avatar/001.gif
3.z1.com/static/css/style.css → att.z1.com/static/css/style.css


最后一种未测试的思路,理论上是可以的
url_rewrite标记模块目标code不使用301,把值改为0,代表在kangle内部完成重写在输出,用户不可见这个过程,等于说无感知实现重写
kangle会主动发起请求到att域名上,然后由于att已经hit命中缓存,此时无需回源,需要确保匹配url填写正确,否则会发生死循环无限跳转的现象
使用这个方案服务器虽然hit缓存,但是浏览器不认可这种缓存,会反复请求服务器

我帮你改了下标题,加了几个关键词方便搜索
欢迎光临IT技术交流论坛:http://bbs.itzmx.com/
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册论坛 新浪微博账号登陆用百度帐号登录

本版积分规则

手机版|Archiver|Mail me|网站地图|IT技术交流论坛 ( 闽ICP备13013206号-7 )

GMT+8, 2026/1/15 05:02 , Processed in 0.092108 second(s), 21 queries , MemCache On.

Powered by itzmx! X3.4

© 2011- sakura

快速回复 返回顶部 返回列表