用户反馈页面上的图片明明早就更新了,可有些人看到的还是老版本,你刷新十次,偶尔好一次,气得想砸键盘,然后你查CDN配置,发现“忽略参数”那个选项正亮着绿灯,心里咯噔一下——得,又是这玩意儿搞的鬼。
别问我怎么知道的,干这行十年,这种破事我见多了,今天咱就掰扯清楚,这个“忽略参数”到底是个啥,什么时候能用,什么时候千万别碰。
原理讲透:CDN缓存到底怎么“认”资源的?
先从一个最基础的问题说起,CDN缓存,本质上就是个巨大的分布式字典,字典的“键”就是用户请求的URL,字典的“值”就是服务器返回的那个文件,你问CDN:“我要 www.example.com/logo.png”,CDN就查这个URL有没有缓存,有就直接给你,没有就去源站拿,听起来简单吧?
URL里经常带一长串问号后面的东西,?version=1、?utm_source=google、?t=123456789,在默认情况下,CDN会把整个URL(包括参数)当作唯一键,也就是说:

忽略参数,CDN的偷懒大招,用不好就翻车
logo.png?version=1是一个缓存logo.png?version=2是另一个缓存
两个长得一模一样的图片,就因为参数不同,被当成两个不同的资源存在缓存里,这不就浪费空间、降低命中率了吗?而且回源请求多了,源站压力也大。
忽略参数”这个功能就诞生了,它的意思很简单:CDN在判断缓存时,把URL里问号后面的参数全部扔掉,只看 protocol + 域名 + 路径,比如不管用户请求的是 logo.png?v=1 还是 logo.png?v=999,CDN都认为它们是同一个资源,只缓存一份,用第一次请求回来的内容服务后续所有请求。
打个比方:你去图书馆借书,书名一样只是版次不同,管理员偷懒,只看书名不看版次,谁先来就把那本旧书给你,后来的人拿到的新款也变成了旧书,这就是“忽略参数”的本质——偷懒,但前提是你的书内容没变。
应用场景:什么时候该“偷懒”?
别一棒子打死,这个功能在某些场景下简直是救命稻草。
最常见的就是统计追踪参数,比如你电商网站上给用户分享链接,后面自动挂了 ?utm_source=wechat&utm_campaign=618,这些参数不影响商品图片内容,但如果不忽略参数,CDN就会为每个不同的utm组合缓存一份图片——几百个参数值就意味着几百个缓存副本,流量翻百倍,回源请求也翻百倍,源站服务器直接冒烟,这时候开启忽略参数,所有图片只缓存一份,美滋滋。
还有一个场景是无休止的随机版本号,有些开发者偷懒,每次更新资源都不改文件名,而是在URL后面加个时间戳 ?t=1680000000,觉得这样就能强制刷新缓存,但问题是,如果这个参数每次都不一样,CDN根本不会命中之前的缓存,等于你让CDN白干活,正确的做法是用文件名哈希,但如果实在改不了,又确认资源内容没变化(比如用的同一张图),那忽略参数也能凑合用。
静态资源的版本管理如果参数只用于版本号而路径不变(style.css?v=1),且你确保每个版本号对应的内容不同,此时绝对不能忽略参数!但是有一种特殊情况:如果你把版本号直接写在文件名里(style.v1.css),那参数自然就没用了,忽略参数反而正确,看明白没?关键看“参数是否代表内容差异”。
案例说明:两个真实的“翻车”现场
正面案例:某社区网站的图片加速
我之前帮过一个社区网站,他们列表页每张图片都带一个 ?from=recommend 的参数用于统计点击来源,图片本身一模一样,但每天几百万请求,参数值有好几十种,CDN命中率只有可怜的12%,源站每天都叫苦,我让他们在CDN上开启了忽略参数(仅忽略query string,保留path),命中率直接飙升到89%,源站负载下降七成,用户打开速度也快了,原因是图片没变过,参数纯属多余。
反面案例:某多语言网站的国际化翻译
另一个兄弟公司,做了个国际化网站,每个页面的文案通过JS请求一个JSON翻译文件,URL是 lang.json?locale=zh-CN 和 lang.json?locale=en-US,他们嫌参数太多,就开启了全局忽略参数,结果所有用户看到的都是第一种语言的翻译——因为第一个请求是中文用户发起的,CDN缓存了中文版本,之后英文用户请求同一个路径,直接拿到了中文内容,网站瞬间崩成国际笑话,这就是典型的把参数当成了内容标识,忽略参数等于把不同版本硬塞成同一个。
常见误区纠正:我见过的最蠢的三种理解
“忽略参数 = 永远不更新缓存”
错大发了,忽略参数只是改变了缓存键的构成,该过期还是会过期,你可以配置缓存过期时间(TTL),或者用刷新API主动删除缓存,很多人以为开了忽略参数就能保证所有请求都拿到最新内容——那是做梦,你源站更新了图片,但CDN里还是旧的,忽略参数并不自动帮你刷缓存,它只是“眼瞎”而已。
“既然能忽略所有参数,那就全忽略吧”
这是最致命的错误,像上面那个多语言例子,参数是关键业务数据,正确的做法是选择性忽略:大部分CDN服务商支持写规则——只忽略指定参数(from、utm_*),保留其他参数,或者反过来,只保留指定的几个参数(locale、id),其余全忽略,你要根据业务逻辑,把“对内容无影响的参数”从缓存键里踢出去,而不是一刀切。
“忽略参数后,URL规范化就能解决缓存混乱”
有些人觉得,既然CDN忽略了参数,那我干脆把参数都去掉,用301重定向到无参数版本,但这样会有额外跳转,损失性能,而且用户分享的带参数的链接依然会被CDN处理,更好的做法是在CDN层面做参数规整:比如对于 ?v=xxx 这种版本号参数,如果内容确实变了,那应该用不同的路径来表达(如 /v1/logo.png),而不是依赖参数,忽略参数只适合参数是“噪音”的场景。
最后再说一句:配置之前,先搞清楚你的URL里每个参数是干什么的。 别让我再看到有人在生产环境把所有参数一锅端,然后凌晨三点打电话求援,CDN不是万能药,“忽略参数”更不是——它会偷懒,但偷懒的方向得你定。
发表评论