You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置NGINX:当WP-Rocket缓存索引文件存在时避免反向代理

问题描述

我部署了一台配置反向代理至Apache的NGINX服务器,由WP-Rocket负责缓存任务,缓存文件存储于wp-content/cache/wp-rocket/mysite.com/路径,索引文件保存为index-https.html。我的需求是当该索引文件存在时,阻止请求被反向代理到Apache,但目前每次刷新页面,Apache日志中仍会出现GET请求。我尝试过指定索引文件及多种try_files配置,但均未生效。

当前NGINX配置:

root /var/www/html;

location ~ \.php$ {
    error_page 420 = @apache;
    return 420;
}

location / {
    index index.html index-https.html;

    error_page 420 = @apache;
    error_page 405 = @apache;

    if ($request_method = POST ) {
        return 420;
    }
    if ( $query_string ){
        return 420;
    }
    if ( $http_cookie ~ "wordpress_logged_in" ){
        return 420;
    }
    expires 365d;

    add_header Cache-Control "public, no-transform";

    gzip_static on;

    try_files $uri wp-content/cache/wp-rocket/mysite.com/$uri/ @apache;
}

location @apache {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port  $server_port;
    proxy_hide_header Upgrade;
}

我尝试过的try_files配置:

try_files $uri wp-content/cache/wp-rocket/mysite.com/$uri/ @apache;
try_files $uri /wp-content/cache/wp-rocket/mysite.com/$uri/ @apache;
try_files $uri /wp-content/cache/wp-rocket/mysite.com/$uri @apache;
try_files $uri /wp-content/cache/wp-rocket/mysite.com/$uri/index-https.html @apache;
问题分析与解决方案

核心问题

  1. 缓存路径匹配错误:当请求根路径/时,$uri的值为/,原配置中wp-content/cache/wp-rocket/mysite.com/$uri/会拼接成wp-content/cache/wp-rocket/mysite.com//,NGINX无法识别该路径下的index-https.html。
  2. index指令作用范围有限:index仅会在当前location的root目录下的对应请求路径中查找索引文件,不会自动遍历WP-Rocket的独立缓存目录,必须在try_files中明确指定缓存文件的完整路径。

修正后的配置

修改location /块中的try_files指令,同时调整缓存文件的匹配逻辑,确保能正确命中根路径和子路径的缓存文件:

root /var/www/html;

location ~ \.php$ {
    error_page 420 = @apache;
    return 420;
}

location / {
    # 保留原有条件判断,确保需要动态处理的请求走Apache
    error_page 420 = @apache;
    error_page 405 = @apache;

    if ($request_method = POST ) {
        return 420;
    }
    if ( $query_string ){
        return 420;
    }
    if ( $http_cookie ~ "wordpress_logged_in" ){
        return 420;
    }

    expires 365d;
    add_header Cache-Control "public, no-transform";
    gzip_static on;

    # 优先匹配请求URI对应的文件,再匹配缓存目录下的索引文件,最后走Apache
    try_files $uri 
              /wp-content/cache/wp-rocket/mysite.com/$uri/index-https.html 
              /wp-content/cache/wp-rocket/mysite.com/$uri 
              /wp-content/cache/wp-rocket/mysite.com/index-https.html 
              @apache;
}

location @apache {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port  $server_port;
    proxy_hide_header Upgrade;
}

配置说明

  • try_files的匹配顺序:
    1. 先尝试直接返回请求的$uri对应的静态文件(如图片、CSS等);
    2. 尝试匹配WP-Rocket缓存目录下对应路径的index-https.html(如请求/about/时,匹配/wp-content/cache/wp-rocket/mysite.com/about/index-https.html);
    3. 尝试匹配缓存目录下与$uri同名的文件(若WP-Rocket生成了非索引格式的缓存文件);
    4. 最后匹配根路径的缓存索引文件index-https.html;
    5. 以上都匹配失败时,才反向代理到Apache。

验证方法

  1. 重启NGINX服务:sudo systemctl restart nginx;
  2. 用curl -I https://your-domain.com查看响应头,若返回200 OK且响应头包含缓存相关字段,说明缓存生效;
  3. 检查Apache日志,确认无多余的GET请求记录。

内容的提问来源于stack exchange,提问作者Артур Димер

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:15:41