使用nginx_fastcgi_cache的时候关于Cookie的处理

产生问题

本站使用了 fastcgi_cache 来缓存所有页面,导致了一个问题,那就是 set-cookie 也被缓存了,其他用户再次访问会导致被设置缓存的 cookie,最终需要实现的效果如下

在缓存 miss/bypass 的状态下,输出 set-cookie
在缓存 hit 的状态下,丢弃 set-cookie
miss:首次访问,无缓存
bypass:条件不符,跳过缓存
hit:缓存命中

要达到这种效果,目前 nginx 的 fastcgi_cache 没有给出解决方案,要么就是直接丢弃所有的 cookie

1
fastcgi_hide_header "Set-Cookie";

这样导致了所有 cookies 全部被丢弃,造成无法登陆等问题

解决方法

查阅了一下,发现了解决方法,那就是使用 nginx_lua 模块实现

在 server 段外增加

1
2
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
map $upstream_bytes_received $hide_cookie {default '';'' Set-Cookie;}

在 server 段内增加

1
2
3
header_filter_by_lua_block {
ngx.header[ngx.var.hide_cookie] = nil;
}

完美实现
未命中缓存
未命中缓存,输出 cookie

命中缓存
命中缓存,丢弃 set-cookie 头

广告时间

推荐一下我的 Typecho 的 fastcgi_cache 缓存插件

Typecho 的 fastcgi_cache 缓存插件

参考:Nginx fastcgi_cache hide Set-Cookie when serving from cache - Server Fault


使用nginx_fastcgi_cache的时候关于Cookie的处理
https://cuojue.org/read/fastcgi_cache_fix_cookies.html
作者
WeiCN
发布于
2020年2月28日
许可协议