質問

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

  1. 匿名のユーザーがいくつかのページを表示しています
  2. ログインしたユーザーは、軽いカスタマイズでいくつかのページを表示しています。これらのカスタマイズはすべて署名されたクッキーに保存され、JavaScriptが動的に入力されます。 Vary-Cookie HTTPヘッダーは設定されていません。
  3. ログインしたユーザーは、データベースからカスタマイズされたデータを含むいくつかのページを表示しています。 Vary-Cookie HTTPヘッダーが設定されています。

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

  1. ページをキャッシュします。これは、ワニスが処理する最も基本的なシナリオです。
  2. 一部のJavaScriptロジックが必要なため、ページをキャッシュしてCookieを削除しません。
  3. Vary-CookieがCookieコンテンツに合図しているため、このページがこのページの出力に影響を与えるため、このページをキャッシュしないでください。

私はワニスに関するいくつかのドキュメントを読んだことがありますが、これがデフォルトの動作であるかどうか、またはそれを実現するためにVCLで何らかのセットアップがあるかどうかはわかりません。

役に立ちましたか?

解決

セッションのみがすべてのクライアントに固有のものであり、必ずしもCookieではありません。

あなたが望むものは理にかなっており、ワニスで可能です、それはあなた自身のVCLを慎重に作成するだけの問題です。 default.vclの次の部分に注意してください:

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


sub vcl_hit {
    if (!obj.cacheable) {
        return (pass);
    }
    ...
}


sub vcl_fetch {
    if (!beresp.cacheable) {
        return (pass);
    }
    if (beresp.http.Set-Cookie) {
        return (pass);
    }
    ...
}

これらの部分を独自のロジックに置き換える必要があります。つまり、独自のVCL_関数を定義します。デフォルトでは、Cookieを使用したリクエスト(VCL_RECV)と応答(VCL_FETCH)はキャッシュできません。バックエンドアプリケーションが最もよく知っているので、この特定のケースに汎用キャッシュロジックを書き換える必要があります。つまり、どの場合にワニスが検索、合格、または配信を行うかを定義する必要があります。

あなたの場合、あなたはすべての人がキャッシュして共有される(Cookieの/なしでリクエスト)、さまざまなCookieなしでページ(ケース1および2)があります。 vcl_recvのreq.http.cookieを気にしないでください。私はページ(ケース3)をさまざまなCookieでキャッシュすることはありません - 少なくとも長い間はありません - それらはまったく共有できません。 vcl_fetchで「パス」を実行します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top