我试图在我的网站上设置一个缓存,该缓存对于某些页面是活动的,而对于其他页面是无效的。 PHP cookie会话用于登录和论坛,因此它们必须在某些页面上处于活动状态
我所拥有的是一张地图,该地图确定了缓存应在哪些页面上激活:
map $request_uri $skip_cache {
default 1;
~^/index.php 0;
/ 0;
~^/objects 0;
~^/places 0;
~^/articles 0;
}
然后在服务器块中,我调用地图以标识服务器在哪个页面上处于活动状态。
我还有另一个地图引用了第一个地图,以标识我们是否应该输出cookie:
map $skip_cache $cache_cookie_ignore {
default "";
1 "";
0 "Set-Cookie";
}
最后,服务器块具有缓存详细信息,并且还引用了两个映射,以确定我们是否应该忽略cookie,以及是否应该缓存页面
server {
listen 80;
listen [::]:80;
#set the domains these rules work on
server_name domain.com
staging.azurewebsites.net;
root /home/site/wwwroot; ## <-- Your only path $
error_log /home/logfiles/nginx/error.log;
location / {
try_files $uri $uri/ $uri.html @php;
}
location @php {
rewrite ^(/[^/]+)$ $1.php last;
rewrite ^(/[^/]+)/(.*)$ $1.php?q=$2 last;
}
#general server settings
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_split_path_info ^(.+?\.php)(/.*)?$;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 3600;
fastcgi_read_timeout 3600;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/site/wwwroot$fastcgi_script_name;
fastcgi_cache cfcache;
fastcgi_cache_valid 30s;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_param FASTCGI_SKIP_CACHE $skip_cache;
#send a SERVER var so we know if the cache is enabled or not
add_header X-FastCGI-Cache $upstream_cache_status;
add_header X-Cookie-Skip $cache_cookie_ignore;
}
}
不幸的是,这导致每个页面的缓存都产生了MISS,我认为这是因为skip cookie指令被忽略了。如何仅跳过特定页面上的cookie?