Caching 为什么Plone 3将语言cookie设置为CSS&;JS注册表文件和如何摆脱它?

Caching 为什么Plone 3将语言cookie设置为CSS&;JS注册表文件和如何摆脱它?,caching,cookies,multilingual,plone,varnish,Caching,Cookies,Multilingual,Plone,Varnish,已安装Plone 3.3.5、LinguaPlone和Products.CacheSetup 门户网站css和门户网站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-Modi

已安装Plone 3.3.5、LinguaPlone和Products.CacheSetup

门户网站css和门户网站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”
这会阻止缓存。我发现了一些与此相关的旧信息:

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

2) 我怎样才能摆脱它?也许有一种比猴子修补更聪明的方法,但在任何地方都没有记录


3) Plone 4.x中与此相关的任何更改?

cookie由LanguageTool设置,仅在请求中尚未出现或与请求中设置的内容不同时设置

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

安装了LinguaPlone后,LanguageTool所做的就是为访问的每个资源确定正确的语言,因为这是确保用户界面语言始终一致的唯一方法

cookie通常已经在主页加载时设置好了(随后主页加载带有cookie集的JS和CSS)。因此,在正常情况下,CSS和JS是完全可缓存的。您只看到Set Cookie头,因为请求中没有相应的
Cookie:I18N\u LANGUAGE=“en”

如果您必须为您的特定用例控制这一点,您可以使用monkeypatch
Products.PloneLanguageTool.LanguageTool.LanguageTool.\uuuu调用\uuuu
,这是一个发布前遍历钩子,将触发每个请求的语言确定。我建议使用collective.monkeypatcher进行此操作。以下是我在最近的一个项目中所做的工作,在该项目中,站点在整个树中使用了一组混合的语言进行迁移(这是我们将来必须解决的问题):

configure.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>
请注意,除非在当前请求中使用了
set\u language
,否则补丁会在事件发生后删除cookie


对于Plone 4.x,此行为没有待定的更改。

在此添加了一些示例代码,说明如何清理cookie:
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']