本文约 2,655 字,预计阅读 7 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
为了让网站变快,你装上了 WP Rocket 或 W3 Total Cache,刚开始确实快了不少。可没过多久问题来了:文章标题改好了,前台刷新还是旧的;发了条评论,退出浏览器再进来评论又消失了;后台明明显示登录状态,前台却说你不认识这个用户。这时候你会怀疑是不是缓存插件坏了,关掉它一切正常,打开就出问题。其实多半不是插件有 bug,而是你没搞清楚「谁在缓存、缓存在哪、什么时候该清」。页面缓存把动态生成的 HTML 存成文件直接返回,省下 PHP 和数据库开销,代价就是内容变了缓存不一定同步更新。缓存这套机制用对了是加速神器,用错了就是各种灵异现象。这篇把原理讲透,再给你一套既能加速又不误事的配置方法。
故障原因分析
- 缓存没有随内容更新失效。页面缓存生成后有自己的有效期,很多插件默认缓存 10 小时甚至 24 小时,你改完文章它还没到期,前台自然显示旧 HTML。
- 浏览器端缓存也在作怪。服务器已经返回新页面,但你本地浏览器把 CSS、JS、HTML 一起缓存了,看到的还是本机旧副本,清浏览器缓存或用无痕窗口才能看到真实结果。
- CDN 缓存独立于站点缓存。你清了 WordPress 缓存,但 CDN 节点上仍存着旧文件,访客拿到的还是旧的,必须单独刷新 CDN 缓存。
- 动态页面被误缓存。登录页、购物车、结账、会员中心这类页面本该实时生成,如果被当成静态页缓存,就会出现登录状态错乱、购物车金额不更新的怪问题。
- 缓存规则与查询参数冲突。带
?参数的 URL、URL 大小写差异、www与非www差异,可能生成多份互不同步的缓存副本,导致你看到的是缓存版本 A,访客看到的是版本 B。
分步解决方案
方法一:养成「改完就清」的习惯
改文章、改菜单、改主题设置后,第一件事是清缓存。以 WP Rocket 为例,顶部工具栏点「Clear and preload cache」即可;W3 Total Cache 在性能菜单点「Empty All Caches」;LiteSpeed Cache 点「Purge All」。清完再用无痕窗口打开前台验证。
方法二:单独清理某一页的缓存
不想全站重生成(大站清缓存很费资源),可以用带参数访问指定页面,让缓存插件只重建这一页:
https://你的域名/?wpr_clear_cache=1 // 仅对已登录管理员生效
WP Rocket 清理单页缓存的正确方式是编辑该文章后直接更新,插件会监听 save_post 钩子自动清理该文章及首页、分类页的缓存。如果发现改了文章首页不更新,说明首页缓存没被关联清理,需要在设置里确认「首页/归档」也在自动清理范围。
方法三:排除不该缓存的关键页面
在缓存插件的「Excluded URLs」或「Never Cache URLs」里,把下面这些路径加进去(每行一条):
/wp-admin/
/wp-login.php
/cart/
/checkout/
/my-account/
/?s=
同时在「排除查询字符串变量」里加上 add-to-cart、removed_item 等 WooCommerce 用到的参数,避免购物车状态被缓存。
方法四:让登录用户和评论者绕过缓存
对已登录用户不显示缓存,可以避免看到错乱的用户状态。很多缓存插件默认就对登录用户不缓存,确认这一项是开启的。如果是自定义代码,可以在 functions.php 里判断:
// functions.php
add_action( 'init', function () {
if ( is_user_logged_in() ) {
if ( ! defined( 'DONOTCACHEPAGE' ) ) {
define( 'DONOTCACHEPAGE', true );
}
}
} );
定义 DONOTCACHEPAGE 常量是 WordPress 缓存插件通用的「本页不缓存」约定。
方法五:清 CDN 和浏览器缓存
站点缓存清完还是不更新,去 CDN 控制台刷新对应目录或整站缓存(又拍云叫「刷新」、腾讯云叫「缓存刷新」)。最后按 Ctrl + F5 强制刷新,或用无痕窗口确认。如果只有你自己看到旧内容,说明问题在浏览器不在服务器。
方法六:检查缓存是否根本没生成成功
装了缓存插件首页还是每次查询数据库,看响应头 X-Cache 或 X-FastCGI-Cache 是不是 HIT。如果一直是 MISS,检查:缓存目录 wp-content/cache 是否可写、wp-config.php 里是否已定义 WP_CACHE 为 true、有没有其他插件的 DONOTCACHEPAGE 把它关掉了。
// wp-config.php
define( 'WP_CACHE', true );
常见踩坑点
- 清缓存后生成的内容还是旧的。这通常是对象缓存(Redis/Memcached)没清。页面缓存清了,但选项、菜单数据还留在对象缓存里,要把对象缓存也一起清空。
- 用管理员身份看前台,永远看到实时内容。缓存插件默认不缓存登录用户,所以你以管理员打开的页面是绕过缓存的,误以为「没生效」。一定要用无痕窗口或退出登录再测。
- 改 CSS/JS 后前台样式没变。这是浏览器和 CDN 层面的静态资源缓存,清理方式不同:要么刷新 CDN,要么给资源加版本号(WP Rocket 的「File Optimization」会自动做版本控制)。
- 排除规则写错路径。路径要以
/开头,且与真实 URL 完全一致,少一个斜杠或大小写不对都会失效。
- 全站频繁清缓存。内容更新频繁的站点每次都全量清缓存再重建,会反复压榨服务器,建议开启「按需清理」和「预加载」,只重建受影响的页面。
总结
开启缓存后页面不更新,绝大多数时候不是缓存的错,而是因为它本来就是「拿旧内容换速度」的机制,你没告诉它什么时候该失效。记住三层缓存要分层清理:站点页面缓存、对象缓存、CDN 与浏览器缓存。日常操作上养成「改完即清」的习惯,用无痕窗口验证效果,把登录页、购物车、结账等动态页面加进排除列表,并确保管理员访问始终绕过缓存。把这几步做对,你就能同时拥有飞快的加载速度和准确的内容显示,再也不必在「要速度」和「要更新」之间二选一。
