法语用户切换语言后刷新,页面仍是英文,清掉 CDN 缓存才恢复,问题每天出现 20 多次。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
proxy_cache_key "$scheme$host$request_uri$http_accept_language"; add_header Vary Accept-Language;
页面缓存只按 URL 做键,没有把语言放进键或 Vary 头。第一个英文请求把整页缓存下来,后面的法语请求直接命中。应用层的模板缓存也没有按 locale 分桶。这一点先确认清楚,后面就不用反复试。
「语言缓存键」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
具体做法是,缓存键加入规范化后的语言标签;响应头补 Vary: Accept-Language;应用层模板缓存按 locale 分开存;用英语和法语交替请求同一 URL 看返回的 Content-Language。
改完照着核一遍,同一 URL 英语返回 en 页面、法语返回 fr 页面,连续刷新十次不再串语言。
