【问题标题】:Is it possible to vary page caches (to have cache versions) with the same url and different cookie value (language)?是否可以使用相同的 url 和不同的 cookie 值(语言)来改变页面缓存(具有缓存版本)?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的评论。但是浏览器立即返回一个缓存页面,我的请求没有被 Varnish/SymfonyReverseProxy 处理。
    【解决方案2】:

    您需要向客户端发送Vary: Cookie,因为对于客户端,他得到的响应取决于他发送的 cookie。但是,如果有任何其他 cookie,例如 google 分析,这将不起作用。

    另一个明显的替代方法是使用域或路径中的语言环境,例如 en.mydomain.com/about 或 mydomain.com/en/about。当人们发送页面链接时,这也更加友好,因为语言是链接的一部分。

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

    【讨论】:

    • 1) Vary: Cookie: 这至少因为 PHPSESSID 不起作用,我已经检查过了 :) 2) 是的,在 URL 中使用语言环境是最简单的方法,但我想避免 URL 中的语言环境。似乎不可能将语言环境存储在 cookie 中并使用 ReverseProxy... 然后我对 FOSHttpCache UserContext 有同样的问题 - 如果服务器返回 Cache-Control max-age=600 并且缓存应该由 X-User-Context-Hash 变化,它是如何工作的。据我了解,页面打开后,它会被浏览器缓存600秒,如果用户更改其角色,浏览器将返回相同的缓存,不是吗?
    • 如果你做max-age,浏览器会缓存页面而不询问服务器。所以你需要设置Vary: Cookie,并确保在用户登录或注销时设置restart the session。这通常是为了安全而推荐的。如果您使用 symfony,请参阅 this doc 而不是使用本机 php 函数。更改语言环境的请求将设置一个 cookie,因此它永远不应该被缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2017-05-24
    • 2015-12-22
    • 2023-03-09
    • 2020-08-22
    相关资源
    最近更新 更多