登录页打开很快,填完账号密码提交,一直提示页面已过期请刷新重试,刷新一次能登进去,过一会儿又不行。只有开了整页缓存的站点复现。乍看像缓存或者权限的锅,追下去往往不是。
// 缓存插件里排除登录相关路径
add_filter('rocket_cache_reject_uri', function ($uris) {
$uris[] = '/login/.*';
return $uris;
});
追下去是这么回事:整页缓存把带 CSRF token 的 HTML 一起存了下来,不同访客拿到同一个 token,服务端比对会话里的值自然不通过。登录页这类带随机值的页面本来就不该进缓存。
「登录页缓存 token」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
具体做法是,登录、注册、找回密码这几条路径排除在整页缓存之外;token 校验失败时给出可操作提示,别只回一个 419;CDN 侧按 Cookie 存在与否绕过缓存;用无痕窗口开两个会话,各提交一次看是否都成功。
验收就看一点,两个无痕窗口各自打开登录页都能一次登进去,不再出现 419。
