2

Varnish ESI で特有の問題が発生しています。

私のサイトの各ページには、(ログインした) ユーザーのアカウント情報を吐き出す ESI フラグメントがあります。

ブラウザが Cache-Control: no-cache / Pragma: no-cache (force refresh) をサーバーから ESI コンテンツを要求するときに送信しない限り、Varnish はユーザー セッション ESI フラグメントのキャッシュされた結果を返しているようです。

私の vcl_recv には、これをバイパスするルールが含まれています。

if(req.url ~ "^/session-header") {
    return(pass);
}

vcl_fetch にもルールがあります。

if(req.url ~ "^/session-header") {
    return(hit_for_pass);
} else {
  set beresp.ttl = 1h;
}

基本的に、これはブラウザ側からの動作です。

Cache-Control: max-age=0 => Varnish はキャッシュされた ESI フラグメントを返します

Cache-Control: no-cache / Pragma: no-cache => Varnish はサーバーから ESI フラグメントを取得します

私はそれを理解できないようで、かなり明白な構成を見逃したような気がします。

4

2 に答える 2

1

誰かがこれを見た場合に備えて、問題を解決してください。

バックエンドは、Varnish がサーバーから新しい ESI フラグメントを提供するかどうかを決定するために使用する Etag を設定していたことが判明しました (強制更新でない限り、ブラウザーは If-None-Match 要求ヘッダーでこの Etag を送信します)。

この 1 行を vcl_deliver に追加しただけで、魅力的に機能するようになりました。

subl vcl_deliver {
  ...
  unset resp.http.Etag;
  ...
}
于 2014-03-24T17:48:58.300 に答える
-1

esi で組み立てられた出力が提供されないように、esi テンプレートの If-Modified-Since および If-None-Since リクエスト ヘッダーを変更する必要がありました。

sub vcl_recv {
...
      unset req.http.If-Modified-Since;
      unset req.http.If-None-Match;
...
}
于 2015-02-10T19:47:54.410 に答える