Почему Plone 3 устанавливает языковые cookie в файлы реестра CSS & JS и как от них избавиться? - PullRequest
3 голосов
/ 19 апреля 2011

Plone 3.3.5, LinguaPlone и Products.CacheSetup установлены.

Языковые файлы cookie установлены для файлов portal_css и portal_javascript

      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?

1 Ответ

4 голосов
/ 19 апреля 2011

Cookie устанавливается LanguageTool и устанавливается только тогда, когда его еще нет в запросе, или отличается от того, что было установлено в запросе.

Обычно LanguageTool смотрит только на этот самый cookie длярешить, какой язык использовать.При обычном использовании Plone вы никогда не увидите этот заголовок Set-Cookie на ресурсах CSS и JS.Однако LinguaPlone настраивает LanguageTool для просмотра гораздо большей информации, включая URL-адрес, к которому вы пытались обратиться, для определения языка, используемого для ответа.

При установленном LinguaPlone LanguageTool определяетправильный язык для каждого ресурса, к которому обращаются, так как это единственный способ обеспечить согласованную поддержку языка интерфейса пользователя.

Файл cookie обычно уже устанавливается при загрузке главной страницы (которая впоследствии загружает JS и CSS снабор печенья).Таким образом, в обычном сценарии ваши CSS и JS отлично кешируются.Вы видите только заголовок Set-Cookie, потому что в запросе нет соответствующего заголовка Cookie: I18N_LANGUAGE="en".

Если вам нужно управлять этим для ваших конкретных случаев использования, вы можете установить monkeypatch Products.PloneLanguageTool.LanguageTool.LanguageTool.__call__, чтохук before-publishing-traverse, который будет запускать определение языка при каждом запросе.Я бы порекомендовал для этого использовать коллективный. 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>

и в модуле patches.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']

Обратите внимание, что исправление удаляет cookie после факта, если только set_language не использовалось в текущем запросе.

Нет изменений в этом поведении для Plone 4.x.

...