web-dev-qa-db-ja.com

ニスの問題、ユーザーがHITページにログアウトしました

誰かが同様の問題を経験しました、私はVarnish(v3、Debian 6にDrupal 7)をインストールしました、そしてVarnish Drupalモジュール、設定された設定phpおよびvcl、そしてログインしたユーザーが時々「ログアウト」されることを除いて、すべてが正常に機能しているように見えます。つまり、ユーザーがリンクをクリックすると、キャッシュされたVarnishページ(HIT)にリダイレクトされます。MISSのページでは、すべてが正常です。

ログインしたユーザーがキャッシュされたページにアクセスしないように強制して、ログアウトする方法を教えてください。

Vclファイルとconfigファイルのセットアップ方法をいくつかのチュートリアル/設定に従って行ったので、管理ページはうまく機能しており、そのような動作を決して表現していません。

ありがとう!

1
NenadP

手遅れかもしれませんが、私はまったく同じ問題を抱えていました。何が問題かを探すために2日間費やし、それから settings.php を読みました:

「Vary:Cookie」がないと、認証されたユーザーにもキャッシュから匿名ページが提供されます。

だから'ommit_vary_cookies'TRUEからFALSEまでsettings.php 問題を解決しました。

$conf['omit_vary_cookie'] = FALSE;
3
malcolm

このルールはdefault.vclで使用する必要があります

# Remove all cookies that Drupal doesn't need to know about. ANY remaining
  # cookie will cause the request to pass-through to a backend. For the most part
  # we always set the NO_CACHE cookie after any POST request, disabling the
  # Varnish cache temporarily. The session cookie allows all authenticated users
  # to pass through as long as they're logged in.
  #
  # 1. Append a semi-colon to the front of the cookie string.
  # 2. Remove all spaces that appear after semi-colons.
  # 3. Match the cookies we want to keep, adding the space we removed
  # previously, back. (\1) is first matching group in the regsuball.
  # 4. Remove all other cookies, identifying them by the fact that they have
  # no space after the preceding semi-colon.
  # 5. Remove all spaces and semi-colons from the beginning and end of the
  # cookie string.
  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, ";(S{1,2}ESS[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 is any cookies left (a session or NO_CACHE cookie), do not
      # cache the page. Pass it on to Apache directly.
      return (pass);
    }
  }
0
flocondetoile