正确配置 ETag 与 Cache-Control,提升 WordPress CDN 命中率


现在很多网站在上线时都会接入 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 的静态资源靠强缓存+版本号,才是最稳妥的方案