是否可以使用相同的URL和不同的cookie值(语言)来改变页面缓存(具有缓存版本)?

时间:2015-04-27 23:05:23

标签: caching http-headers browser-cache reverse-proxy varnish

我们有一个多语言网站,并希望缓存,例如第/about页。 英语和白俄罗斯语页面具有相同的URL:/about,语言存储在cookie中并从中检测到。

  • En:/about,Cookie:site_lang: en
  • Be:/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不会处理用户的请求。

所以我的问题是,如何处理这种情况,有哪些可能的解决方案。 主要要求是我们不希望在网址中使用语言

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以在vcl_hash函数中自定义Varnish用于其哈希键的内容,请参阅here

答案 1 :(得分:0)

您需要向客户端发送Vary: Cookie,因为对于客户端,他获得的响应取决于他发送的cookie。但是,如果存在任何其他Cookie(例如Google Analytics),则无法使用此功能。

另一个显而易见的选择是使用域或路径中的区域设置,所以en.mydomain.com/about或mydomain.com/en/about。当人们发送链接到页面时,这也是更友好的,因为语言是链接的一部分。

如果您的应用程序是使用symfony构建的,那么更改策略没有问题,并且还有一种语言是"默认"并且URL中没有区域设置。