现在很多网站在上线时都会接入 CDN,加速已经算是标配了。但不少人会发现,即使用了 CDN,缓存效果依旧不理想,源站压力并没有明显下降。其实问题往往就出在 HTTP 响应头 上。
简单来说,WEB 服务器(Nginx、Apache)给资源加的那些标头,会直接决定 CDN 到底怎么缓存。今天我想重点聊聊几个关键的标头,尤其是经常被吐槽的 ETag。
哪些标头会左右 CDN 缓存?
(1) Cache-Control
这是大哥级别的标头,基本上 CDN、浏览器都要看它的脸色行事。
public
:CDN、浏览器都能缓存。private
:只让浏览器缓存,CDN 不参与。max-age=31536000
:缓存时间,这里是一年。no-cache
/no-store
:完全禁止缓存。
我自己习惯在 Nginx 里这样写:
location ~ \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|otf)$ {
expires 1y;
add_header Cache-Control "public, max-age=31536000";
}
(2) Expires
这是老一辈的方案(HTTP/1.0 标准),基本上现在就是给老浏览器看的。新环境下用 Cache-Control
就行,但写一下也无妨。
(3) ETag
这个是争议最多的。理论上很美好:给文件一个唯一标识,下次请求时比对一下,如果没变就返回 304 Not Modified
。
但问题是,ETag 的生成规则有时候特别坑。比如它会把服务器的 inode 或时间戳算进去,那在多服务器、多节点的环境下,每台机器算出来的 ETag 都不一样,结果就是缓存白搭。
所以我的建议很简单:静态资源长缓存就直接关掉 ETag。该省的验证就别浪费了。Nginx 配置示例:
location ~ \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
if_modified_since off;
etag off;
}
(4) Last-Modified
这个标头更像是 ETag 的“简化版”,直接告诉你文件最后修改的时间。配合 If-Modified-Since
一起用。
但它的精度只有秒级,而且文件一改时间就变,所以也会带来一些缓存失效的问题。
ETag:用还是不用?
很多新手总觉得 ETag 是必须的,其实真不是。
- 优点:确实能精确判断内容有没有变动。
- 缺点:一旦生成规则不合理,就会拖累 CDN 缓存效率。
所以我自己的做法是:
- 静态文件(JS、CSS、图片等) → 直接禁用 ETag,用强缓存就够了。
- 动态内容 → 有需要的时候才用 ETag 或 Last-Modified 来做协商缓存。
WordPress 场景下要注意啥?
(1) 插件和服务器别打架
像 W3 Total Cache 等的一些缓存插件,自己就会写入响应头。如果你的 Nginx/Apache 也写了一份,结果可能就是相互覆盖,缓存策略完全乱掉。所以一定要统一规则。
(2) 静态资源的版本号
WordPress 默认不会给 CSS/JS 加版本号,结果用户可能一直加载到旧文件。解决办法有两种:
- 装个 Autoptimize 插件,让它自动加版本参数。
- 或者在主题里手动指定:
wp_enqueue_style('theme-style', get_stylesheet_uri(), array(), '1.0.1');
实践经验分享
缓存怎么配?
- 静态资源:果断强缓存 →
Cache-Control: public, max-age=31536000
。 - 动态内容:适当用 ETag 或 Last-Modified 做补充。
怎么验证?
我常用浏览器调试工具这类工具看响应头,也会翻一下 CDN 日志。经验来看,如果 304
返回太多,那说明缓存命中率不高,要么是 ETag 在作怪,要么是资源更新得太频繁。
小提醒
- 能不频繁改文件就别改,更新版本号的方式更优雅。
- 各家 CDN(EdgeOne、Cloudflare、阿里云等)都有默认缓存策略,别忘了先看看自带的设置。
- 如果使用腾讯云 CDN 或 EdgeOne,推荐使用 WordPress CDN 缓存管理插件。
最后总结
标头 | 会不会影响缓存 | 我的建议 |
---|---|---|
Cache-Control |
✅ 会 | 静态资源强缓存,public, max-age=31536000 |
Expires |
✅ 会 | 老浏览器兼容用,核心还是靠 Cache-Control |
ETag |
⚠️ 看情况 | 静态资源关掉,动态资源按需使用 |
Last-Modified |
⚠️ 看情况 | 可做备用,长缓存时可以忽略 |
一句话总结:别迷信 ETag,WordPress 的静态资源靠强缓存+版本号,才是最稳妥的方案。