如何配置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;
问题分析与解决方案
核心问题
- 缓存路径匹配错误:当请求根路径
/时,$uri的值为/,原配置中wp-content/cache/wp-rocket/mysite.com/$uri/会拼接成wp-content/cache/wp-rocket/mysite.com//,NGINX无法识别该路径下的index-https.html。 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的匹配顺序:- 先尝试直接返回请求的
$uri对应的静态文件(如图片、CSS等); - 尝试匹配WP-Rocket缓存目录下对应路径的
index-https.html(如请求/about/时,匹配/wp-content/cache/wp-rocket/mysite.com/about/index-https.html); - 尝试匹配缓存目录下与
$uri同名的文件(若WP-Rocket生成了非索引格式的缓存文件); - 最后匹配根路径的缓存索引文件
index-https.html; - 以上都匹配失败时,才反向代理到Apache。
- 先尝试直接返回请求的
验证方法
- 重启NGINX服务:
sudo systemctl restart nginx; - 用
curl -I https://your-domain.com查看响应头,若返回200 OK且响应头包含缓存相关字段,说明缓存生效; - 检查Apache日志,确认无多余的GET请求记录。
内容的提问来源于stack exchange,提问作者Артур Димер
相关产品推荐
相关产品推荐

