2010-11-25 10 views
16

ワニスを使用して、特定のページをクッキーの存在下でもキャッシュしたいと思います。匿名ユーザーが光のカスタマイズで、いくつかのページを見ているユーザーに ワニスを無視する、クッキーを削除しないでください

  • Aが記録され、いくつかのページを見ている

    1. :私はの世話をする必要がある3つの可能性があります。これらのカスタマイズはすべて、署名付きクッキーに格納され、Javascriptによって動的に生成されます。 vary-cookie httpヘッダーが設定されていません。
    2. ログインしたユーザーが、データベースのカスタマイズされたデータを含む一部のページを表示しています。 vary-cookie httpヘッダーが設定されます。

    期待される行動は次のようになります。

    1. キャッシュページ。これはワニスが扱う最も基本的なシナリオです。
    2. ページをキャッシュし、一部のJavascriptロジックで必要とするため、Cookieを削除しないでください。
    3. このページは、さまざまなCookieがCookieの内容によってこのページの出力に影響するため、キャッシュしないでください。

    私はワニスについていくつかのドキュメントを読みましたが、これがデフォルトの動作であるかどうか、またはVCLでそれを実現するための設定があるかどうかはわかりません。

  • +1

    クロスサイトポストとしてクローズ:http://serverfault.com/q/205768/72348 – casperOne

    答えて

    17

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

    あなたが望むのは、ワニスでは理にかなっていて、可能なのは自分の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_関数を定義します。デフォルトでは、クッキーによるリクエスト(vcl_recv)とレスポンス(vcl_fetch)はキャッシュできません。バックエンドアプリケーションを最もよく知っているので、ジェネリックキャッシュロジックをこの特定のケースに書き換える必要があります。つまり、ワニスがルックアップ、パス、またはデリバリーを行う場合を定義する必要があります。

    あなたのケースでは、さまざまな種類のCookieがないページ(ケース1と2)があり、誰でもキャッシュされ共有されます(Cookieの有無によるリクエスト)。 vcl_recvのreq.http.Cookieを気にしないでください。私は、さまざまなクッキーを使用してページをキャッシュしません(または、少なくとも長期間ではありません)。これはまったく共有できないためです。 vcl_fetchで 'pass'を実行します。

    +0

    * vcl_fetch *で、私はしたいと思います:* if(beresp.http.Vary〜 "Cookie"){ return(pass); } *。 –

    +1

    はい。また、vcl_recvでは、デフォルトの動作に戻すべきではありませんが、req.http.Cookieが設定されている場合は、「均等に」参照してください。 私はあなたのアプリケーションを完全に理解していませんが、私はSet-Cookieを行う応答をキャッシュすることに気をつきます。クッキー値をベースにしたjavascriptでキャッシュされた応答を提供します(クライアントを信頼する場所を厳密にチェックするだけです)。 – ivy

    +0

    ここではほぼ同じ問題があります。私のvcl_recvは復帰(ルックアップ)で終わり、私のvcl_fetchはこれです:sub vcl_fetch { \t if(req.backend == dinamic){ \t \t esi; \t} \t if(req。バックエンド==静的){ \t \t unset beresp.http.set-cookie; \t}}でも、ディナミックバックエンド(キャッシュする必要があります)へのすべてのリクエストは、どんな考えですか?私はesiを使用してカスタムキャッシュを作成していますが、ワニスはアプリケーションの出力から得られるものをキャッシュしていないので、無駄になってしまいます。 – Tiago

    関連する問題