3

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 でこれに関連する変更はありますか?

4

1 に答える 1

4

CookieはLanguageToolによって設定され、リクエストにまだ存在しない場合、またはリクエストで設定されたものとは異なる場合にのみ設定されます。

LanguageToolは通常、使用する言語を決定するためにそのCookieのみを調べます。そのための通常のPloneの使用では、CSSおよびJSリソースにそのSet-Cookieヘッダーが表示されることはありません。ただし、LinguaPloneは、応答に使用する言語を決定するために、アクセスしようとしたURLなど、より多くの情報を参照するようにLanguageToolを構成します。

LinguaPloneがインストールされている場合、LanguageToolが行うことは、アクセスされるすべてのリソースに対して正しい言語を決定することです。これは、全体を通して一貫したUI言語を保証する唯一の方法です。

通常、Cookieはメインページの読み込み時にすでに設定されています(その後、Cookieが設定された状態でJSとCSSが読み込まれます)。したがって、通常のシナリオでは、CSSとJSは完全にキャッシュ可能です。リクエストに対応するヘッダーがないため、Set-Cookieヘッダーのみが表示Cookie: I18N_LANGUAGE="en"されます。

特定のユースケースでこれを制御する必要がある場合は、モンキーパッチを使用できますProducts.PloneLanguageTool.LanguageTool.LanguageTool.__call__。これは、公開前のトラバースフックであり、すべてのリクエストで言語の決定をトリガーします。これには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>

および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']

set_language現在のリクエストで使用されていない限り、パッチは事後にCookieを削除することに注意してください。

Plone4.xのこの動作について保留中の変更はありません。

于 2011-04-19T16:04:30.910 に答える