
文章目录
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 回源时出现证书链或重定向循环。
实施步骤
- 在 CDN 控制台添加加速域名,填写源站 IP 与回源端口 80 或 443。
- 配置缓存规则:静态资源按扩展名设 30 天缓存,HTML 设不缓存或绕过。
- 在 WordPress 侧设置登录态 Cookie 识别,使登录用户请求回源。
- 配置源站 Nginx 还原真实 IP,使用 CDN 提供的回源 IP 段。
- 发布新样式后通过版本参数或 CDN 刷新接口破缓存。
- 用 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

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 段。
验证与回滚流程
- 用 curl -I 检查静态资源 Cache-Control 与 X-Cache 状态。
- 用隐身窗口与登录窗口对比 HTML 是否 BYPASS。
- 改版本号后确认新 URL 回源且旧 URL 不再被返回。
- 查看源站日志确认 REMOTE_ADDR 是用户真实 IP。
- 若任一步失败,先在 CDN 控制台把缓存规则改为「全站不缓存」。
- 再逐步放开规则,每放一条就重跑上述验证。
上线前建议对照 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 后才算完成。
动作清单
- 核对 Nginx、PHP、WordPress 版本并备份现有配置。
- 在 CDN 添加域名,配置静态资源缓存与不可缓存路径。
- 设置 Cookie 绕过规则,隔离登录态。
- 配置 real_ip 还原用户 IP 并 reload Nginx。
- 用版本号或哈希发布新样式,验证命中与回源。
若你在接入 CDN 时需要主题层配合改造,可了解我们的主题开发服务:https://runokwp.com/services/theme-development/,也欢迎阅读更多技术文章:https://runokwp.com/tech-articles/。
