【发布时间】:2015-07-06 14:23:57
【问题描述】:
我们有一个多语言网站并且想要缓存例如页面/about。
英语和白俄罗斯语页面具有相同的 URL:/about,语言存储在 cookie 中并从 cookie 中检测。
- En:
/about,cookie:site_lang: en - 是:
/about,cookie:site_lang: be
我们有一个 ReverseProxy 缓存(SymfonyHttp 或 Varnish)。
当第一个用户打开 cookie 中带有 en 值的 /about 页面时,它会被 ReverseProxy 和浏览器缓存。
响应头:
Cache-Control max-age=600, public, s-maxage=600
Last-Modified Mon, 27 Apr 2015 21:48:34 GMT
Vary X-Language
...
什么是X-Language:
由于我们不能因 Cookies 而异(这将导致每个用户的缓存版本至少会因为会话 id 而有所不同),因此我们会因 Apache 设置的自定义标头而异。
因此,当用户发出 GET 请求时,Apache 会解析 site_lang cookie 并将解析后的值添加到自定义标头 X-Language。有了这个逻辑,ReverseProxy 就知道该做什么了:如果此标头中没有某种语言的缓存,则只需返回缓存或将请求转发给应用程序。
当第二个用户打开 /about 页面并在 cookie 中使用 be 值时,Apache 解析此语言,创建 X-Language: be 标头和 ReverseProxy 不返回 en 语言的缓存但将请求转发到应用程序.
但当第一个用户尝试使用站点上的 LocaleSwitcher 更改区域设置时,它不起作用。当它试图点击另一种语言的链接时,浏览器立即返回本地缓存页面,当然Apache不会处理用户的请求。
所以我的问题是,如何处理这种情况,可能的解决方案是什么。 主要要求是我们不想在 URL 中包含语言。
谢谢。
【问题讨论】:
标签: caching http-headers browser-cache reverse-proxy varnish