留言表单每次提交都提示验证码已经过期,刷新页面验证码又不变,换个浏览器才能成功提交一次。乍看像缓存或者权限的锅,追下去往往不是。

location = /contact/ {
    proxy_cache off;
    add_header Cache-Control 'no-store';
}

追下去是这么回事:整页缓存把带验证码的那份 HTML 一起存了下来,令牌在缓存那一刻就固定住了,用户拿到的是几小时之前那一份,怎么填都过不了。

「验证码被整页缓存」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

具体做法是,带有表单的页面不要进入整页缓存,给它单独放行;验证码改成单独走接口下发,别直接写进页面里;响应头统一加上 private 和 no-store,让浏览器这边也别缓存下来。

验收就看一点,连着刷新几次验证码都应该变化,提交后不再提示已经过期。

作者 9823189