我们有一个多语言网站,并希望缓存,例如第/about
页。
英语和白俄罗斯语页面具有相同的URL:/about
,语言存储在cookie中并从中检测到。
/about
,Cookie:site_lang: en
/about
,Cookie:site_lang: be
我们有一个ReverseProxy缓存(SymfonyHttp或Varnish)。
当第一个用户在Cookie中打开/about
页面,其值为en
时,它会被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
:由于我们不能因Cookie而异(因为至少会话ID会导致每个用户拥有不同的缓存版本),因此我们会根据Apache设置的自定义标头而有所不同。
因此,当用户发出GET请求时,Apache会解析site_lang
cookie并将解析后的值添加到自定义标头X-Language
。有了这个逻辑,ReverseProxy知道该怎么做:如果这个标题中没有某种语言的缓存,只需将缓存或转发请求返回给应用程序。
当第二个用户在Cookie中打开/about
页面,be
值,Apache解析此语言,创建X-Language: be
标题并且ReverseProxy不返回{ {1}}语言,但转发请求申请。
但是,当第一个用户尝试使用网站上的LocaleSwitcher更改区域设置时,它不起作用。当它试图点击另一种语言链接时,浏览器会立即返回本地缓存页面,当然,Apache不会处理用户的请求。
所以我的问题是,如何处理这种情况,有哪些可能的解决方案。 主要要求是我们不希望在网址中使用语言。
谢谢。
答案 0 :(得分:0)
您可以在vcl_hash
函数中自定义Varnish用于其哈希键的内容,请参阅here。
答案 1 :(得分:0)
您需要向客户端发送Vary: Cookie
,因为对于客户端,他获得的响应取决于他发送的cookie。但是,如果存在任何其他Cookie(例如Google Analytics),则无法使用此功能。
另一个显而易见的选择是使用域或路径中的区域设置,所以en.mydomain.com/about或mydomain.com/en/about。当人们发送链接到页面时,这也是更友好的,因为语言是链接的一部分。
如果您的应用程序是使用symfony构建的,那么更改策略没有问题,并且还有一种语言是"默认"并且URL中没有区域设置。