web-dev-qa-db-ja.com

クッキーを削除するのではなく、ワニスを無視させる方法

Cookieが存在する場合でも、Varnishを使用して特定のページをキャッシュしたいと思います。私が世話をする必要がある3つの可能性があります:

  1. 匿名ユーザーがページを表示しています
  2. ログインしたユーザーは、簡単にカスタマイズしてページを表示しています。これらのカスタマイズはすべて署名付きCookieに保存され、Javascriptによって動的に入力されます。可変Cookiehttpヘッダーが設定されていません。
  3. ログインしたユーザーが、データベースのカスタマイズされたデータを含むページを表示しています。可変Cookiehttpヘッダーが設定されます。

予想される動作は次のとおりです。

  1. ページをキャッシュします。これは、Varnishが処理する最も基本的なシナリオです。
  2. 一部のJavascriptロジックが必要とするため、ページをキャッシュし、Cookieを削除しないでください。
  3. 変更クッキーはCookieの内容がこのページの出力に影響を与えることを通知しているため、このページをキャッシュしないでください。

Varnishに関するいくつかのドキュメントを読みましたが、これがデフォルトの動作であるかどうか、またはそれを実現するためにVCLで実行する必要のあるセットアップがあるかどうかがわかりません。

6
Jason Christa

デフォルトでは、VarnishはCookieヘッダーを使用してリクエストをキャッシュしません。

http://varnish-cache.org/svn/trunk/varnish-cache/bin/varnishd/default.vcl

  sub vcl_recv {
(...)
  if (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
        return (pass);
    }
    return (lookup);

必要な動作を構成にコーディングする必要があります。 Cookieは、「ページ」(実際にはオブジェクト)ではなく、クライアント要求の一部であることに注意してください。 「ページ」(オブジェクト)には「Set-Cookie」ヘッダーが付属しています。これがキャッシュされます。

また、「Vary:Cookie」は「キャッシュしない」という意味ではありません。これは、受信したCookieの値ごとに1つのオブジェクトをキャッシュすることを意味します。

アプリケーションがCookieに基づいてコンテンツを生成しない場合は、無視しても安全です。

-      if (req.http.Authorization || req.http.Cookie) {
+      if (req.http.Authorization) {

いくつかのテストを行うと、コツをつかむことができます。お役に立てれば。

3
Thiago Figueiro

私があなたを正しく理解していれば、キーの一部として特定のCookieは必要ありませんが、そのままにしておく必要がありますか?

Vcl_hashのハッシュをreq.url + req.http.Host(および場合によっては他のホスト)に設定する必要がありますが、特定のCookieは設定しないでください。

私の投稿の1つが正しい方向に役立つと思います: Varnish VCLのGETパラメーターを無視します

0
3molo