首页 › 博客 › 文章

WordPress 接 CDN:缓存规则、回源与清缓存策略

WordPress 接 CDN:缓存规则、回源与清缓存策略

WordPress 接入 CDN 的正确做法是:静态资源走 CDN 并设长期缓存,HTML 默认不缓存或按登录态绕过,后台与动态路径全部回源。判断做对了的标准是:未登录访问命中缓存且版本参数更新后能立刻失效,登录后不串态,源站日志拿到真实用户 IP。

准备:环境与现状核对

开始前确认源站 Nginx 或 Apache 版本、PHP 版本与 WordPress 版本。2026 年主流源站为 Nginx 1.26 或 1.27,PHP 8.3 或 8.4,WordPress 6.8 或 6.9。CDN 侧准备一枚自定义 CNAME,例如 cdn.example.com,并确认源站 IP 与端口可直连。

先做一次基线记录:源站 Nginx 访问日志路径通常为 /var/log/nginx/access.log,配置目录为 /etc/nginx/conf.d/。用 curl 直连源站拿到原始响应头,后面每一步都以此对照。

curl -I http://127.0.0.1/wp-content/themes/mytheme/style.css
curl -I http://127.0.0.1/

若源站启用了 HTTPS,先按 WordPress HTTPS 配置:证书、混合内容与强制跳转 把证书与跳转理顺,避免 CDN 回源时出现证书链或重定向循环。

实施步骤

  1. 在 CDN 控制台添加加速域名,填写源站 IP 与回源端口 80 或 443。
  2. 配置缓存规则:静态资源按扩展名设 30 天缓存,HTML 设不缓存或绕过。
  3. 在 WordPress 侧设置登录态 Cookie 识别,使登录用户请求回源。
  4. 配置源站 Nginx 还原真实 IP,使用 CDN 提供的回源 IP 段。
  5. 发布新样式后通过版本参数或 CDN 刷新接口破缓存。
  6. 用 curl 与浏览器隐身窗口验证命中状态、登录态与源站日志 IP。

哪些路径不能缓存

以下路径必须设置为不缓存或直接回源,不能进入 CDN 的 HTML 或对象缓存层。

  • /wp-admin/ 全部路径,含 /wp-admin/admin-ajax.php。
  • /wp-login.php 与 /wp-register.php。
  • /wp-cron.php 与任何触发定时任务的路径。
  • REST API 根路径 /wp-json/ 下写入类接口,以及含 nonce 的动态请求。
  • 预览链接 /?p=123&preview=true 与自定义预览路由。
  • 购物车、结账、会员中心等 WooCommerce 或会员插件动态页。

CDN 侧用「路径不缓存」规则表达。以主流 CDN 控制台为例,新建规则:匹配类型为路径前缀,值依次填入上述路径,缓存行为设为「不缓存」。

源站 Nginx 侧也加一层保险,对后台与登录页返回 private 响应头,即使 CDN 规则漏配也不会缓存。

location ~* ^/(wp-admin|wp-login.php|wp-cron.php) {
    add_header Cache-Control "private, no-store, no-cache, must-revalidate";
    proxy_pass http://127.0.0.1:8080;
}
location = /wp-login.php {
    add_header Cache-Control "private, no-store";
}

验证方式:用 curl 请求 /wp-login.php,查看响应头是否含 no-store,且多次请求 X-Cache 头为 MISS 或 BYPASS。若出现 HIT,说明规则未生效,回退方法是把该路径从 CDN 缓存规则中删除并重新发布。

HTML 缓存与登录态

未登录访客的首页与文章页 HTML 可以由 CDN 缓存,但登录用户、评论者、含有 WordPress 登录 Cookie 的请求必须回源,否则会出现串态:A 用户看到 B 用户的后台条或个人信息。

获取报价

邮箱 + 需求 + 预算区间,24 小时内回复报价。

WordPress 登录态相关 Cookie 名称如下:wordpress_logged_in_、wordpress_sec_、wordpress_test_cookie、wp-settings-、wp-postpass_。CDN 侧配置「按 Cookie 绕过缓存」:当请求携带上述任一 Cookie 前缀时,行为设为回源。

2026 年部分 CDN 支持在控制台直接勾选 WordPress 预设模板,若不支持则手动填写 Cookie 正则。

# CDN 控制台逻辑示意(非 Nginx 配置)
if (cookie matches "wordpress_logged_in_") { bypass_cache(); }
if (cookie matches "wp-postpass_") { bypass_cache(); }
if (cookie matches "wordpress_sec_") { bypass_cache(); }

源站 Nginx 侧同步设置默认 Cache-Control,让未登录 HTML 可被缓存但时间较短,登录态由 CDN 绕过保证。

location / {
    add_header Cache-Control "public, max-age=300";
    try_files $uri $uri/ /index.php?$args;
}

验证方式:使用两个浏览器,一个登录后台,一个隐身未登录。未登录请求首页看 X-Cache: HIT;登录后再请求同一 URL 看 X-Cache: BYPASS,且页面顶部出现管理员工具条。若登录后仍 HIT,检查 CDN Cookie 规则是否漏了 wordpress_sec_。

排障时可在 给 WordPress 搭一套 Staging 环境:不碰线上数据做试验 中先复现,避免直接在生产上试错。

改样式后如何破缓存

静态资源用版本参数或文件名哈希破缓存。WordPress 主题中注册样式时应使用 wp_enqueue_style 并传入版本号。

function mytheme_enqueue() {
    $ver = '1.4.2';
    wp_enqueue_style(
        'mytheme-style',
        get_stylesheet_uri(),
        array(),
        $ver
    );
    wp_enqueue_script(
        'mytheme-main',
        get_template_directory_uri() . '/js/main.js',
        array(),
        $ver,
        true
    );
}
add_action( 'wp_enqueue_scripts', 'mytheme_enqueue' );

每次改完 style.css 或 main.js,把 $ver 加 1,例如从 1.4.2 改成 1.4.3。CDN 侧对带不同 query string 的 URL 视为不同对象,新版本自然回源拉取。

若 CDN 开启了「忽略 query string」过滤,上述方法失效。此时改用文件名哈希:把 style.css 构建为 style.a1b2c3.css,并在主题中引用新文件名。

另一种方式是调用 CDN 刷新 API。以常见接口为例:

curl -X POST 'https://cdn-api.example.com/purge' 
  -H 'Authorization: Bearer YOUR_TOKEN' 
  -d '{"urls":["https://cdn.example.com/wp-content/themes/mytheme/style.css"]}'

验证方式:改版本号后 curl 新 URL,看 X-Cache 为 MISS 且响应体是新内容;再请求一次变 HIT。若旧版本仍被返回,检查 CDN 是否忽略 query string,并回退到文件名哈希方案。

回源与真实 IP

回源与真实 IP

CDN 回源时源站看到的是 CDN 节点 IP,不是用户 IP。这会导致评论、防火墙、限流插件记录错误来源。必须在 Nginx 层还原。

主流 CDN 通过 X-Forwarded-For 或自定义头传递真实 IP。Nginx 使用 real_ip 模块,先在 http 块引入 CDN 的回源 IP 段。

# /etc/nginx/conf.d/cdn-realip.conf
set_real_ip_from 203.0.113.0/24;
set_real_ip_from 198.51.100.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

然后在站点配置的 server 块中确保 PHP 能拿到正确 REMOTE_ADDR。WordPress 侧读取用户 IP 的函数应使用 $_SERVER[‘REMOTE_ADDR’],插件如 Wordfence 会依赖此值。

location ~ .php$ {
    fastcgi_param REMOTE_ADDR $remote_addr;
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

验证方式:从外网访问站点,在源站执行 tail -f /var/log/nginx/access.log,看日志首字段是否为你的公网 IP 而非 CDN 节点 IP。若仍是 CDN IP,检查 set_real_ip_from 是否覆盖了 CDN 文档中的全部回源段。

回滚方法:注释 cdn-realip.conf 并 nginx -t 后 reload,恢复为直连模式,再逐步加回 IP 段。

验证与回滚流程

  1. 用 curl -I 检查静态资源 Cache-Control 与 X-Cache 状态。
  2. 用隐身窗口与登录窗口对比 HTML 是否 BYPASS。
  3. 改版本号后确认新 URL 回源且旧 URL 不再被返回。
  4. 查看源站日志确认 REMOTE_ADDR 是用户真实 IP。
  5. 若任一步失败,先在 CDN 控制台把缓存规则改为「全站不缓存」。
  6. 再逐步放开规则,每放一条就重跑上述验证。

上线前建议对照 WordPress 上线前检查清单:26 项逐条过一遍 把 CDN 相关项纳入发布门禁。

常见问题

CDN 缓存了后台页面怎么办?

立即在 CDN 控制台把 /wp-admin/ 与 /wp-login.php 设为不缓存,并刷新这些 URL。同时在 Nginx 加 no-store 头防止二次发生。

为什么改了 CSS 但前台没变?

多半是 CDN 忽略了 query string 或版本号没更新。改用文件名哈希,或调用 CDN 的 purge API 强制回源。

源站日志全是 CDN IP 正常吗?

不正常。需要配置 real_ip 模块与 CDN 回源 IP 段,确认 REMOTE_ADDR 还原为用户 IP 后才算完成。

动作清单

  1. 核对 Nginx、PHP、WordPress 版本并备份现有配置。
  2. 在 CDN 添加域名,配置静态资源缓存与不可缓存路径。
  3. 设置 Cookie 绕过规则,隔离登录态。
  4. 配置 real_ip 还原用户 IP 并 reload Nginx。
  5. 用版本号或哈希发布新样式,验证命中与回源。

若你在接入 CDN 时需要主题层配合改造,可了解我们的主题开发服务:https://runokwp.com/services/theme-development/,也欢迎阅读更多技术文章:https://runokwp.com/tech-articles/。

参考资料与延伸阅读

WPDaiwei

WPDaiwei-专业Wordpress网站定制开发提供商

需要 WordPress 开发服务?

24 小时内免费出方案与报价,国内国外都接单。

QQ