web-dev-qa-db-ja.com

Varnishで認証済みユーザーのページをキャッシュしない

次の問題があります。ユーザーがログインして、匿名ユーザーであったときにアクセスしたページをナビゲートすると、ログインしたユーザーのページバージョンではなく、キャッシュされたページが表示されます。 Varnishを使用していますが、次のコードを試したところ、結果は得られませんでした。

  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, ";(SESS[a-z0-9]+|NO_CACHE)=", "; \1=");
    set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
    set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");

    if (req.http.Cookie == "") {
      # If there are no remaining cookies, remove the cookie header. If there
      # aren't any cookie headers, Varnish's default behavior will be to cache
      # the page.
      unset req.http.Cookie;
    }
    else {
      # If there are any cookies left (a session or NO_CACHE cookie), do not
      # cache the page. Pass it on to Apache directly.
      return (pass);
    }
  } 

この問題を回避するにはどうすればよいですか?

ありがとう

1
xger86x

Settings.phpで$conf['omit_vary_cookie'] = TRUE;を使用していますか?

その場合、ログアウト時に以前にページを表示したことがあるログインしたユーザーは、手動でブラウザを更新するまで、ページのワニスキャッシュバージョンが提供されます。

解決策は、settings.phpの$conf['omit_vary_cookie'] = TRUE;をコメントアウトすることです。

これはdefault.settings.php(drupal 7.34)で説明されています:

 /**
 * Page caching:
 *
 * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page
 * views. This tells a HTTP proxy that it may return a page from its local
 * cache without contacting the web server, if the user sends the same Cookie
 * header as the user who originally requested the cached page. Without "Vary:
 * Cookie", authenticated users would also be served the anonymous page from
 * the cache. If the site has mostly anonymous users except a few known
 * editors/administrators, the Vary header can be omitted. This allows for
 * better caching in HTTP proxies (including reverse proxies), i.e. even if
 * clients send different cookies, they still get content served from the cache.
 * However, authenticated users should access the site directly (i.e. not use an
 * HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid
 * getting cached pages from the proxy.
 */
# $conf['omit_vary_cookie'] = TRUE;

このDAの質問もこの問題に回答します: 「Vary:Cookie」ヘッダーは実際にVarnishからページを提供するために何をしますか?

1
Taylor Taff