开了整页缓存之后,登录用户刷新一下首页,右上角显示的是别人的用户名,退出再重新登录一次才恢复。乍看像缓存或者权限的锅,追下去往往不是。
if ($http_cookie ~* 'wordpress_logged_in') {
set $skip_cache 1;
}
proxy_cache_bypass $skip_cache;
追下去是这么回事:缓存键只按 URL 来计算,页面里带着用户信息也被整页存了下来,下一个访客直接拿到同一份缓存副本,串号的问题就是这么来的。
「整页缓存串登录态」这类改动最怕改一半,回滚脚本先准备好,再动生产。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
具体做法是,带登录 cookie 的这类请求直接绕过缓存,不进公共副本;缓存键上再加上 cookie 分组或者用户角色这两个维度;页面里的用户名改成异步加载,不参与整页缓存。
验收就看一点,两个账号交替刷新首页,各自都只能看到自己的用户名,不再串。
