如何配置Nginx规则实现WordPress Feed URL的双版本(缓存/非缓存)需求
如何配置Nginx规则实现WordPress Feed URL的双版本(缓存/非缓存)需求
嘿,我完全懂你的需求——给WordPress的Feed做两个并行版本,一个走缓存、一个彻底绕开缓存,用来模拟CloudFront的不同缓存行为,而且两个URL都得能正常工作,内部服务专门用非缓存的那个对吧?之前我帮不少开发者处理过类似的场景,给你一套经过验证的Nginx配置方案,应该能完美解决你的问题。
核心思路
我们通过Nginx的location块分别匹配两个Feed URL:
- 先匹配
/abc-feed/路径,配置成完全不缓存的规则,同时把请求转发到原Feed的实际路径; - 再匹配原
/feed/路径,配置常规的缓存规则,实现缓存版本的需求。
这样既能保证两个URL都能正常返回WordPress Feed内容,又能精准区分缓存行为。
具体配置步骤
1. 先定义Nginx缓存池(全局配置)
首先要在http块里配置缓存存储的路径和参数,这样后续的缓存规则才能生效。如果已经配置过可以跳过这一步:
http { # 其他全局配置... # 定义WordPress专用缓存池 proxy_cache_path /var/cache/nginx/wordpress_feed levels=1:2 keys_zone=wp_feed_cache:10m max_size=5g inactive=24h use_temp_path=off; }
解释一下参数:
/var/cache/nginx/wordpress_feed:缓存文件存储的物理路径keys_zone=wp_feed_cache:10m:缓存键的内存区域,10M足够存储大量Feed的缓存键max_size=5g:缓存的最大磁盘占用,可根据服务器磁盘大小调整inactive=24h:超过24小时未被访问的缓存会被自动清理
2. 配置非缓存版Feed(/abc-feed/)
在你的WordPress站点的server块里,先添加这个规则(一定要放在缓存版规则前面,Nginx会优先匹配第一个符合的location):
server { # 其他server配置(比如listen、server_name等)... # 处理非缓存的abc-feed版本 location ~ ^(.+)/abc-feed/$ { # 强制Nginx不缓存这个请求,也不使用已有的缓存 proxy_no_cache 1; proxy_cache_bypass 1; # 给客户端/上游服务返回明确的不缓存头 add_header Cache-Control "no-cache, no-store, must-revalidate" always; add_header Pragma "no-cache" always; add_header Expires "0" always; # 把请求重写到原Feed路径,让WordPress能正常处理 rewrite ^(.+)/abc-feed/$ $1/feed/ last; }
3. 配置缓存版Feed(/feed/)
接着在同一个server块里添加缓存版的规则:
# 处理缓存的原Feed版本 location ~ ^(.+)/feed/$ { # 启用之前定义的缓存池 proxy_cache wp_feed_cache; # 缓存键的规则:包含域名+请求路径,避免多站点缓存冲突 proxy_cache_key "$host$request_uri"; # 不同状态码的缓存时长:200/302缓存1小时,404缓存1分钟 proxy_cache_valid 200 302 1h; proxy_cache_valid 404 1m; # 可选:添加缓存状态头,方便调试(比如查看是HIT/MISS/BYPASS) add_header X-Cache-Status $upstream_cache_status; # 下面是转发请求到WordPress后端的配置,根据你的实际环境调整: # 如果是用PHP-FPM运行WordPress: include fastcgi_params; fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 替换成你的PHP-FPM套接字路径 fastcgi_param SCRIPT_FILENAME $document_root/index.php; # 如果是反向代理到其他服务(比如Apache),替换成下面的内容: # proxy_pass http://localhost: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; } }
关键注意事项
- location匹配顺序:一定要把
/abc-feed/的规则放在/feed/前面,否则Nginx会优先匹配原Feed的缓存规则,导致非缓存版本失效。 - 后端配置适配:根据你的WordPress运行环境(PHP-FPM/反向代理)调整缓存版location里的后端转发配置,确保请求能正确到达WordPress。
- 权限检查:确保Nginx对
/var/cache/nginx/wordpress_feed路径有读写权限,否则缓存无法正常生成。
测试验证方法
配置完成后重启Nginx,用curl命令测试两个URL的响应头:
# 测试缓存版Feed curl -I https://www.example.com/your-post-slug/feed/ # 查看响应头:应该有X-Cache-Status(第一次是MISS,刷新后变成HIT),Cache-Control是缓存相关的 # 测试非缓存版Feed curl -I https://www.example.com/your-post-slug/abc-feed/ # 查看响应头:Cache-Control应该是`no-cache, no-store, must-revalidate`,X-Cache-Status是BYPASS
如果两个URL都能正常返回Feed内容,且响应头符合预期,那就说明配置成功了!
备注:内容来源于stack exchange,提问作者user103373
相关产品推荐
相关产品推荐

