要让 fastcgi_cache_key 正确区分不同 php 应用,核心是在缓存键中显式加入能唯一标识应用的变量,推荐使用 $server_name、$fastcgi_script_name 或自定义 map 变量(如 $app_id)扩展缓存键,避免多应用共用缓存导致内容错乱,并确保同一 keys_zone 内键全局唯一。

要让 fastcgi_cache_key 正确区分不同 PHP 应用,核心是在缓存键中显式加入能唯一标识应用的变量,避免多个应用共用同一缓存条目导致内容错乱或越权访问。
缓存键必须包含应用标识
Nginx 默认的 fastcgi_cache_key(如 "$scheme$request_method$host$request_uri")只依赖请求路径和域名,无法识别后端是哪个 PHP 应用。若多个站点共用同一缓存区(如 keys_zone=phpcache:100m),且未做隔离,A 站点的 /api/user 可能返回 B 站点缓存的内容。
推荐做法:用 $server_name 或自定义变量标识应用
-
$server_name:对应server块中的server_name指令,适合按域名区分(如site-a.com/site-b.com) -
$fastcgi_script_name:包含脚本路径(如/index.php、/admin/index.php),适合单域名多子目录结构 - 自定义
map变量:更灵活,可按路径前缀、Host 头或环境变量映射应用名
示例配置:
map $host $app_id {
"site-a.com" "app_a";
"site-b.com" "app_b";
"~^api\.(.+)$" "app_api_$1";
}
然后在 location 或 http 块中使用:
fastcgi_cache_key "$scheme$request_method$host$request_uri$app_id";
避免常见陷阱
- 不要用
$document_root:它只是文件系统路径,不参与缓存键计算,且可能因软链接或符号路径导致不一致 - 不要依赖
fastcgi_param传入的变量:fastcgi_cache_key在 Nginx 请求处理阶段生成,早于 FastCGI 参数传递,无法使用$_SERVER['APP_NAME']这类 PHP 层变量 - 同一缓存区(
keys_zone)内必须保证键全局唯一:若两个应用用了相同$app_id,仍会冲突;建议每个应用配独立keys_zone更稳妥
实际搭配建议
- 对多租户或微服务架构,优先用
map+$host或$request_uri前缀提取应用标识 - ThinkPHP、Laravel 等框架常带版本或环境标识,可配合
$arg_v(如/api?v=2)增强区分度 - 若应用通过子目录部署(如
example.com/app1/,example.com/app2/),可用正则提取:map $request_uri $app_dir { ~^/app1/(.*)$ "app1"; ~^/app2/(.*)$ "app2"; default "default"; }
缓存键设计不是越长越好,关键是稳定、可预测、无歧义。只要应用边界清晰,加一个 $app_id 就足够可靠。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











