要精准刷新单条商品缓存,需三方面协同:一、fastcgi_cache_key必须包含$request_uri以唯一标识商品页;二、purge location须用相同变量拼出完全一致的key并限制IP;三、通过curl访问/purge/路径触发,协议域名等须与原请求严格一致。

要对单条商品数据(比如 /product/123)做定向缓存刷新,核心是让 ngx_cache_purge 模块能精准匹配该 URL 对应的 fastcgi_cache key,并只删这一条,不波及其他缓存。这需要三方面协同:缓存 key 设计、purge location 配置、触发方式可控。
一、确保 fastcgi_cache_key 能唯一标识商品页
缓存能否被精准清除,取决于你定义的 `fastcgi_cache_key` 是否把商品 ID 作为关键因子。如果 key 里没包含实际路径或 ID,purge 就找不到目标。
推荐配置(含商品页典型特征):
fastcgi_cache_key "$scheme$request_method$host$request_uri$is_args$args";
说明:
-
$request_uri 包含完整路径,如
/product/123或/product/123?utm_source=share; - $is_args$args 确保带参数的请求(如分页、筛选)也生成独立缓存项;
- 避免使用
$request_filename或$document_uri,它们可能被重写后丢失原始路径。
⚠️ 验证方法:在日志中临时加 log_format cache '$cache_key';,访问商品页看日志输出是否含 /product/123 字样。
二、配置 purge location,支持按 URI 清除
`ngx_cache_purge` 不支持直接传 URL 路径,而是靠构造和缓存 key **完全一致的字符串**来匹配。因此 location 规则必须还原出原始 key 的组成部分。
在 server 块中添加:
location ~ ^/purge(/.*) {
allow 127.0.0.1;
allow 192.168.1.100; # 可信运维 IP
deny all;
<pre class="brush:php;toolbar:false;"># 关键:用相同变量拼出和 fastcgi_cache_key 一致的字符串
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1$is_args$args";
}
说明:
-
$1捕获/purge(/.*)中的/product/123部分,等价于原始请求的$request_uri; -
WORDPRESS是你在fastcgi_cache_path中定义的 keys_zone 名称,必须严格一致; - 务必限制访问来源,
purge接口一旦暴露公网,等于开放缓存删除权限。
三、触发定向刷新的正确方式
清除单条商品缓存,只需向 purge 接口发起一次 GET 请求,路径与商品页 URI 对齐。
例如刷新 https://example.com/product/123:
curl -X GET "http://127.0.0.1/purge/product/123"
或带参数(如清除带 SKU 的变体):
curl -X GET "http://127.0.0.1/purge/product/123?sku=black-xl"
注意:
- 协议(
http/https)、域名、大小写、尾部斜杠都需与原始请求完全一致; - 若商品页走 HTTPS,但 Nginx 内部用 HTTP 与 PHP 通信,
$scheme应设为$https或统一用https,避免 key 不匹配; - 返回
200 OK表示删除成功,404 Not Found表示该 URL 当前无缓存(不是错误)。
四、配合业务系统自动触发(可选增强)
商品编辑后,后端 PHP 可主动调用 purge 接口,实现“改完即生效”。
PHP 示例(使用 cURL):
$url = 'http://127.0.0.1/purge/product/' . (int)$product_id; $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); curl_close($ch);
说明:
- 建议加简单鉴权(如 header token),或仅允许内网调用;
- 可批量刷新关联路径,如同时清
/product/123和/api/v1/product/123(需对应配置另一组 fastcgi_cache_key 和 purge 规则)。










