caching - 为什么 Plone 3 在 CSS 和 JS 注册表文件中设置语言 cookie 以及如何摆脱它?

标签 caching cookies multilingual plone varnish

已安装 Plone 3.3.5、LinguaPlone 和 Products.CacheSetup。

为portal_css 和portal_javascript 文件设置的语言cookie

      HTTP/1.1 200 OK
      Server: Zope/(unreleased version, python 2.4.5, linux2) ZServer/1.1 Plone/3.3.5
      Expires: Tue, 26 Apr 2011 10:42:56 GMT
      Last-Modified: Tue, 19 Apr 2011 10:42:56 GMT
      Cache-Control: max-age=604800
      Content-Type: application/x-javascript;charset=utf-8
      Set-Cookie: I18N_LANGUAGE="en"; Path=/
      Content-Length: 192404
      Date: Tue, 19 Apr 2011 10:42:56 GMT
      X-Varnish: 452768899
      Age: 0
      Via: 1.1 varnish
      Connection: keep-alive
    Pituus: 192404 (188K) [application/x-javascript]
    Tallennetaan kohteeseen ”tiny_mce-cachekey1974.js”

这可以防止缓存。我找到了一些与此相关的旧信息:

http://www.evax.fr/papers/nginx-varnish-and-multilingual-plone

1)为什么要这样设置?我假设默认情况下所有资源都是语言中立的,并且仅在特殊条件下才包含特定于语言的内容。

2)我该如何摆脱它?也许有比猴子修补更聪明的方法,但没有在任何地方记录。

3) Plone 4.x 中是否有与此相关的更改?

最佳答案

cookie 由 LanguageTool 设置,并且仅当请求中尚未存在或与请求中设置的内容不同时才设置。

LanguageTool 通常只会查看该 cookie 来决定使用哪种语言。在正常的 Plone 使用中,你永远不会在 CSS 和 JS 资源上看到 Set-Cookie header 。然而,LinguaPlone 将 LanguageTool 配置为查看更多信息,包括您尝试访问的 URL,以确定用于响应的语言。

安装 LinguaPlone 后,LanguageTool 的作用是确定访问的每个资源的正确语言,因为这是确保整个 UI 语言一致的唯一方法。

Cookie 通常已在加载主页时设置(随后使用设置的 Cookie 加载 JS 和 CSS)。因此,在正常情况下,您的 CSS 和 JS 是完全可缓存的。您只能看到 Set-Cookie header ,因为请求中没有相应的 Cookie: I18N_LANGUAGE="en" header 。

如果您必须针对特定用例控制这一点,您可以使用monkeypatch Products.PloneLanguageTool.LanguageTool.LanguageTool.__call__,这是一个将触发语言的发布前遍历钩子(Hook)对每一个请求的决心。我建议为此使用 Collective.monkeypatcher 。这是我在最近的一个项目中所做的,其中网站在整个树中使用混合语言集进行了迁移(我们必须在将来的某个时候解决这个问题):

配置.zcml:

<?xml version="1.0"?>
<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:monkey="http://namespaces.plone.org/monkey"
    >
<!-- other directives -->

<include package="collective.monkeypatcher" />
<monkey:patch
    description="Patch LanguageTool before traverse hook to prevent setting
                 the language cookie"
    class="Products.PloneLanguageTool.LanguageTool.LanguageTool"
    original="__call__"
    replacement=".patches.LanguageTool__call__"
    preserveOriginal="true"
    />
</configure>

在 patch.py​​ 模块中:

from ZPublisher.HTTPRequest import HTTPRequest

def LanguageTool__call__(self, container, req):
    """The __before_publishing_traverse__ hook.

    Patched to *not* set the language cookie, as this breaks the site model.

    """
    self._old___call__(container, req)
    if not isinstance(req, HTTPRequest):
        return None
    response = req.response
    if 'I18N_LANGUAGE' in response.cookies:
        if 'set_language' in req.form:
            return None
        del response.cookies['I18N_LANGUAGE']

请注意,除非在当前请求中使用了 set_language,否则补丁会在事后删除 cookie。

Plone 4.x 的此行为没有待更改。

关于caching - 为什么 Plone 3 在 CSS 和 JS 注册表文件中设置语言 cookie 以及如何摆脱它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5715216/

相关文章:

javascript - 在 Cookie Javascript 中设置过期时间

drupal-7 - 国家路径 drupal 模块如何工作?

PHP UTF-8 编码搞砸了

php - 为当天剩余时间缓存 PHP 脚本

caching - 任何缓存 DNS 服务器都可以异步刷新它们的缓存吗?

java - 需要选择更新类似 Guava 缓存的功能

reactjs - 在 Go 中从 Back 发送 Cookie,这是一个 api 休息,使用 React JS 发送到前端

python - 从 QNetworkCookie、PyQt4 打印 cookie

c# - 如何在 MongoDB 中缓存一些临时数据?

reporting-services - SSRS 中的多语言