我已经像这样设置了 FastCGI 缓存:
location ~ \.php(/.*)?$ {
fastcgi_cache RWI;
fastcgi_cache_valid 200 60m;
set $nocache 0;
if ($request_method = POST)
{
set $nocache 1;
}
if ($http_cookie ~ (rwi_userid*|rwi_password*)) {
set $nocache 1;
}
if ($request_uri ~* "/(vb/admincp/)") {
set $nocache 1;
}
fastcgi_no_cache $nocache;
fastcgi_cache_bypass $nocache;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass "unix:/var/www/vhosts/system/{domain}/php-fpm.sock";
include /etc/nginx/fastcgi.conf;
}
在区块顶部server{}
我有:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=RWI:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;
问题是我的 PHP 脚本 (vBulletin) 总是发送 Pragma & Cache-Control private
。当上述规则不适用时,有什么方法可以忽略这些标头并强制 FastCGI 使用缓存?我对这种缓存可能性有点迷茫。
答案1
Nginx 在用作反向代理时会解释一组标头以遵守 HTTP 中间缓存规范。这意味着,如果您的应用程序回复中存在以下标头,则将更改缓存行为,如下所述:
“X-Accel-Expires” 标头字段设置响应的缓存时间(以秒为单位)。零值禁用响应的缓存。如果该值以 @ 前缀开头,则它会设置自纪元以来的绝对时间(以秒为单位),响应最多可缓存至该时间。
如果报头不包含“X-Accel-Expires”字段,则可以在报头字段“Expires”或“Cache-Control”中设置缓存的参数。
如果标头包含“Set-Cookie”字段,则此类响应将不会被缓存。
如果标头包含具有特殊值“*”的“Vary”字段,则不会缓存此类响应(1.7.7)。如果标头包含具有其他值的“Vary”字段,则将考虑相应的请求标头字段来缓存此类响应(1.7.7)。
然而,nginx 自带了fastcgi_ignore_headers
指令,以防您想关闭它。因此,您要查找的是:fastcgi_ignore_headers Cache-Control Pragma;
。