搜索全站
插件 9 分钟阅读

WP Super Cache 简单模式与专家模式:两种模式的选择与规则写法

WP Super Cache 的简单模式和专家模式到底差在哪?本文讲清两种模式的执行路径、.htaccess 与 Nginx 规则写法、缓存垃圾回收参数、WPLOCKDOWN 等常量,以及什么情况下该用哪一种。

U
UFO_PF 2023-09-26 · 阅读 9 分钟
WP 插件
阅读提示
本文约 3,575 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:免费的、古老的,但至今仍在大量站点上跑着

WP Super Cache 是 Automattic(WordPress.com 母公司)出品的免费缓存插件,历史比 WP Rocket 还久。它不花哨,只做一件事:把页面生成静态 HTML 文件存到 wp-content/cache/supercache/,然后让 Web 服务器直接返回这些文件。

它的关键设置只有一个:简单模式(Simple)还是专家模式(Expert)。这个选择决定了请求是否要启动 PHP。很多站点装完一直停在简单模式(插件默认),页面确实快了一些,但 TTFB 还是在 200–400ms 徘徊;切到专家模式后能降到 40–80ms。差别就在那一行 rewrite 规则上。

原理分析:两条执行路径的差别

项目 简单模式(Simple / PHP 模式) 专家模式(Expert / mod_rewrite 模式)
命中时是否启动 PHP 是(先加载 WordPress,再由 PHP 读静态文件) 否(Web 服务器直接返回静态文件)
配置方式 无需改服务器配置 需要 .htaccess(Apache)或手工写 Nginx 规则
兼容性 最高,任何环境都能跑 依赖服务器模块与规则正确
典型 TTFB 150–400ms 30–80ms
风险 低 规则写错会导致整站 500 或缓存串号

差别可以这么理解:简单模式是”用 PHP 读一个现成的 HTML 文件”,专家模式是”PHP 根本不知道有这次请求”。前者省掉了数据库查询和主题渲染,但仍要启动 PHP-FPM、加载 WordPress 的一部分;后者连这步也省了。

专家模式的规则依赖一个约定:缓存文件路径是 wp-content/cache/supercache/{HTTP_HOST}/{REQUEST_URI}/index.html。Web 服务器先尝试这个文件,存在就直接返回,不存在才走 index.php。另外插件还会生成 .meta 文件记录缓存过期时间,以及一个全局的 WPLOCKDOWN 机制。

还有几个关键常量,写在 wp-config.php 里:

define( 'WP_CACHE', true );          // 总开关,两种模式都需要
define( 'WPSC_DISABLE_COMPRESSION', true );  // 关闭 gzip 压缩,交给服务器处理
define( 'WPLOCKDOWN', true );        // 锁定:已知用户一律不读缓存,直接动态生成

WPLOCKDOWN 是个容易被忽略但很有用的开关:开启后,插件只给”完全匿名的访客”返回缓存,任何带登录 Cookie 的请求都不走缓存路径。这能规避绝大多数缓存串号问题。

保姆级实操

第一步:安装并确认 WP_CACHE

grep -n "WP_CACHE" wp-config.php || \
  wp config set WP_CACHE true --raw --type=constant

第二步:基础设置

后台 设置 → WP Super Cache → 高级:

  • 勾选”缓存命中后直接提供静态文件”;
  • 勾选”压缩页面”(或关掉交给服务器 gzip);
  • 勾选”当有新文章或评论时清理缓存”;
  • Cache Timeout:默认 3600 秒;
  • Scheduler:设为 “Clock: 每天一次” 或 “Twice Daily”,用于垃圾回收。

第三步:选择模式

同一页的 Delivery Method 区域:

  • Simple:直接保存即可,无需改服务器;
  • Expert:插件会尝试写入 .htaccess(Apache)。Nginx 需要手动配置。

第四步:Nginx 下的专家模式规则

插件不会自动写 Nginx 规则,需要手工加入站点配置:

set $supercache_file '';
set $cache_uri $request_uri;

# 只缓存 GET 请求
if ($request_method != GET) { set $cache_uri 'null cache'; }
# 带查询参数不缓存
if ($query_string != "") { set $cache_uri 'null cache'; }
# 登录用户、评论者不缓存
if ($http_cookie ~* "comment_author|wordpress_logged_in|wp-postpass_") {
    set $cache_uri 'null cache';
}

if ($cache_uri != 'null cache') {
    set $supercache_file "/wp-content/cache/supercache/$http_host/${cache_uri}index.html";
}

location / {
    try_files $supercache_file $uri $uri/ /index.php?$args;
}

尾部斜杠的处理很关键:如果站点的固定链接带尾斜杠,路径是 {uri}/index.html;不带尾斜杠则是 {uri}/index.html 也会由插件生成,但 ${cache_uri}index.html 的拼接要匹配。配置后用命令验证:

nginx -t && systemctl reload nginx

# 找一个已缓存的路径确认文件存在
ls wp-content/cache/supercache/mimangfei.com/ | head

第五步:验证命中

curl -sI https://mimangfei.com/ | grep -iE 'cache-control|x-wp-super|x-nocache'
# 第二次请求起应该看到明显更快的 TTFB,且响应头里不再有 PHP 生成的动态标记

for i in 1 2 3; do curl -o /dev/null -s -w "%{time_starttransfer}\n" https://mimangfei.com/; done

第六步:管理缓存目录

# 看看缓存占用
du -sh wp-content/cache/

# 手工清理(后台也有 Delete Cache 按钮)
rm -rf wp-content/cache/supercache/*

# 手工触发垃圾回收后确认目录被清理

常见踩坑

  1. 切到 Expert 后整站 500。Nginx 规则里变量拼接错误或目录不可读。先在测试环境验证规则。
  2. 规则没覆盖带尾斜杠的路径。首页能命中,文章页不命中。
  3. 案例:一个站点切换专家模式后,几位移动端用户反馈看到别人的登录状态。原因是 Nginx 规则里漏了 wordpress_logged_in 的 Cookie 判断,而 WP Super Cache 的移动端缓存又开启着,导致带登录 Cookie 的请求读到了别人生成的缓存页。修复是在规则里补上 Cookie 排除,并开启 WPLOCKDOWN,彻底杜绝已知用户读缓存。
  4. 缓存目录无限增长。没配垃圾回收,wp-content/cache/ 几个月涨到几十 GB。
  5. 改了主题但缓存没清。前台还是旧样式,需要手动清空缓存目录。
  6. 和 Opcode 缓存叠加导致更新延迟。PHP OPcache 里还是旧代码,需要一起清。
  7. 卸载后 advanced-cache.php 残留。和 W3TC 一样,卸载后要手工删除 wp-content/advanced-cache.php 并确保 WP_CACHE 被移除。

总结

选择标准很简单:能用专家模式就用专家模式,收益是数量级的(TTFB 从数百毫秒降到几十毫秒),代价只是多写几行服务器规则;只有在无法修改服务器配置的环境(部分虚拟主机)才退回简单模式。无论哪种模式,两件事必须做对:wp-config.php 里的 WP_CACHE 常量,以及规则里对登录 Cookie 的排除。前者决定缓存是否生效,后者决定会不会出现缓存串号——后者一旦出错,后果远比慢一点严重。

想要更省心的付费方案可以看 WP Rocket 配置全解析;服务器层面的优化另见 Nginx 下 WordPress 缓存规则配置。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。