0

まず第一に、私の下手な英語で申し訳ありません。それは私の自然言語ではありません。

管理ユーザーがバックエンドするための Cookie を使用してワニスを構成しようとしていますが、ログインやその他のチェックに問題があります。

私のrecv、fetch、hashの設定:

backend default {
  .host = "127.0.0.1";
  .port = "8080";
}

sub vcl_recv {

   remove req.http.X-Forwarded-For;
   set req.http.X-Forwarded-For = client.ip;

   if (req.request == "POST"){
        return (pass);
   }

   # Grace mode
   if (! req.backend.healthy) {
          set req.grace = 30m;
   } else {
      set req.grace = 15s;
   }

   if(req.url ~ "^localhost$"){
    set req.http.host = "www.micasa.com";
   } 

   # Acces to system URL's is protected
   if ((req.url ~ "^/server_status") || (req.url ~ "^/discover/varnish_server")) {
        error 403 "Go away, please";
   }

  # Delete all cookies except from user

  if ( !(req.url ~ "^/logout") && 
       !(req.url ~ "^/profile") && 
       !(req.url ~ "^/playlists") && 
       !(req.url ~ "^/users") && 
       !(req.url ~ "^/signup") && 
       !(req.url ~ "^/comments") && 
       !(req.url ~ "^/login") && 
       !(req.url ~ "^/remind"))
        {
                unset req.http.cookie;
        }

sub vcl_fetch {

  # Grace mode
  # https://www.varnish-cache.org/docs/trunk/tutorial/handling_misbehaving_servers.html#grace-mode
  set beresp.grace = 30m;

  # Saint mode
  # https://www.varnish-cache.org/docs/trunk/tutorial/handling_misbehaving_servers.html#saint-mode
  if (beresp.status == 500) {
    set beresp.saintmode = 10s;
    return (restart);
  }
  if ( !(req.url ~ "^/login") && (req.request == "GET")){
        unset beresp.http.set-cookie; # To avoid caching of cookies
  }

  # Process ESIs if X-RUN-ESI is set. This will be stripped before being sent down to client.
  if ( beresp.http.X-RUN-ESI ) {
    set beresp.do_esi = true;
    remove beresp.http.X-RUN-ESI;
  }

  # cache 404s and 301s for 5 minute
  if (beresp.status == 404 || beresp.status == 301 || beresp.status == 500) {
     set beresp.ttl = 15m;
     return (deliver);
  }

  # cache images and static assets during 15m
  if ( req.url ~ "\.(png|gif|jpg|css|js|ico)" ) {
     set beresp.ttl = 15m;
     return (deliver);
  }


  # If X-VARNISH-TTL is set, use this header's value as the TTL for the varnish cache.
  # Expires, cache-control, etc. will be passed directly through to the client
  # Cribbed from http://www.lovelysystems.com/configuring-varnish-to-use-custom-http-headers/
  if (beresp.http.X-VARNISH-TTL) {
    C{
      char *ttl;
      /* first char in third param is length of header plus colon in octal */
      ttl = VRT_GetHdr(sp, HDR_BERESP, "\016X-VARNISH-TTL:");
      VRT_l_beresp_ttl(sp, atoi(ttl));
    }C
    remove beresp.http.X-VARNISH-TTL;
    return (deliver);
  }
sub vcl_deliver {
    unset resp.http.x-url; # Optional
    if ( req.url ~ "\.(png|gif|jpg|css|js|ico|woff)" ) {
      set resp.http.expires = "3600";
    }

    #mikel
    #remove resp.http.X-Powered-By;
    remove resp.http.Server;
    #remove resp.http.X-Varnish;
    #remove resp.http.Via;
    #remove resp.http.Age;

}

sub vcl_hash {
   if (req.http.Cookie ~ "_micasa_session") {
     hash_data(req.url);
     hash_data(req.http.Cookie);
         return (hash);
   }
}

ユーザーでログインしようとすると問題ありませんが、その後同じページを更新すると、Cookie が失われ、すぐにログアウトされます。問題はサブ vcl_recv にあるのでしょうか?

助けてくれてありがとう。

4

1 に答える 1

3

定義されたページ以外のすべての Cookie の設定を解除します。あなたのサイトのログイン情報はほぼ確実に Cookie (セッション Cookie?) に保持されます。簡単な方法は、ログインしているユーザーを識別する Cookie が設定されているかどうかを確認して、ログインしているユーザーのキャッシュを無効にすることです。すべてのユーザーに同じセクションがキャッシュされるように、ESI を使用することをお勧めします。

于 2013-04-06T13:43:13.923 に答える