まず、これが可能かどうかを調べたいのです。
したがって、Varnish は Cookie がある場合にはオブジェクトをキャッシュしないことがわかります。
受信リクエストにクッキーが含まれている場合、Varnish はそれらを変数に保存し、それらのクッキーを削除してから、バックエンドに渡すと考えています。バックエンドが処理を完了すると、Varnish はクッキーを戻します。
これは可能なのでしょうか?
もしそうなら、VCL はどのようになっているでしょうか?
答え1
コンテクスト
Varnish はキャッシュに関しては保守的であり、Cookie の使用は応答のパーソナライズのレベルを意味するものと想定しています。
パーソナライズされた応答をキャッシュすると、プライバシーやセキュリティの問題が発生する可能性があります。また、出力に一貫性がなくなる可能性もあります。
ショッピング カートがあるページをキャッシュすることを想像してください。ページ全体をキャッシュすると、すべてのユーザーのショッピング カートの値が同一になります。
クッキー用の Varnish の組み込み VCL 動作は次のとおりです。
Cookie
Varnish はリクエストにヘッダーを見つけると、コンテンツがパーソナライズされていると想定するため、キャッシュからオブジェクトを提供しません。
Set-Cookie
Varnish は、応答にヘッダーがある場合、Cookie の設定はパーソナライゼーションも意味する状態の変更であるため、オブジェクトをキャッシュに保存しません。
クッキーの除去
レスポンス ヘッダーを通じて Cookie が設定されると、実際にはこれらの Cookie を必要としないページであっても、後続のすべてのリクエストのリクエスト ヘッダーSet-Cookie
として渡されます。Cookie
そのため、どのページに Cookie が必要で、どのページに必要でないかを判断することが重要です。追跡 Cookie はサーバーではなくクライアントによって JavaScript で処理されるため、追跡 Cookie を識別することも同様に重要です。
以下は、サーバー上で必要なものを除いてすべての Cookie を削除する VCL の例です。
vcl 4.1;
sub vcl_recv {
if (req.http.Cookie) {
set req.http.Cookie = ";" + req.http.Cookie;
set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
set req.http.Cookie = regsuball(req.http.Cookie, ";(PHPSESSID)=", "; \1=");
set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");
}
if (req.http.cookie ~ "^\s*$") {
unset req.http.cookie;
}
}
この場合、
PHPSESSID
ログインを追跡する必要があるため、Cookie のみが保持されます。置換ロジックの後もこの Cookie が残っている場合、Varnish はキャッシュからの応答を提供しません。この Cookie が設定されていないが、追跡 Cookie が多数ある場合は、すべての Cookie が削除され、ページはキャッシュから提供できます。
特定のページのCookieを削除する
前の例では、選択した Cookie を削除してPHPSESSID
Cookie のみを保持することを説明しましたが、実際にはそのセッション Cookie を必要としないページに移動してしまう可能性もあります。
以下に、管理ページやショッピング カート ページなど、実際に特定の Cookie を必要とするページを除いて、Cookie が完全に削除される VCL の例を示します。
vcl 4.1;
sub vcl_recv {
if(req.url ~ "^/admin" || req.url == "/cart") {
return(pass);
}
unset req.http.Cookie;
}
Set-Cookie ヘッダーの削除
示されているようにhttps://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#dont-cache-responses-with-set-cookie-headersSet-Cookie
ただし、ヘッダーが使用されると状態の変更を意味するため、組み込み VCL ではオブジェクトをキャッシュに保存しません。
ただし、これはページがキャッシュに残らないことを意味するものではありません。Cookie がSet-Cookie
すでに設定されているため、次のバックエンド応答にはヘッダーが含まれない可能性があります。その場合、ヘッダーのない次の応答がSet-Cookie
キャッシュに残る可能性があります。
ただし、特定のページに Cookie を設定する必要がないことが確実な場合は、ヘッダーを削除することもできますSet-Cookie
。
次の例では、バックエンドが静的コンテンツの Cookie を設定するのを防ぎます。
vcl 4.1;
sub vcl_backend_response {
if (bereq.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|ogg|ogm|opus|otf|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
unset beresp.http.Set-Cookie;
}
}
クッキーの再添付
ヘッダーに Cookie 値を保存し、VCL で Cookie を削除してキャッシュから提供し、最終的にバックエンドのリクエストに再添付することは可能ですが、あまり意味がありません。
キャッシュ可能な応答が出力を作成するために Cookie を必要としない場合、なぜバックエンド要求に Cookie を送信するのでしょうか?
バックエンドの要求で出力を作成するために Cookie 値が必要な場合は、応答がキャッシュできない可能性が高いため、その要求に対してはキャッシュを完全にバイパスしたほうがよいでしょう。
次のステップ
あなたの質問はあまり具体的ではなかったので、私も非常に一般的な回答をしなければなりませんでした。
私の回答があなたの質問に完全に答えている場合は、ユースケースについてさらに詳しく指定していただければ、それに応じてより詳細な回答をさせていただきます。