0

Varnishには次の構成があります。しかし、アプリケーションにアクセスすると、ログインは求められず、ログインするだけです。私が間違っていることは何ですか?

デフォルト.vcl

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


sub vcl_recv { 
     if(req.url ~ "sign_in" || req.url ~ "sign_out" || req.request == "POST" || req.request == "PUT" || req.request == "DELETE") {
    return (pass);
    }
    return (lookup);
}

sub vcl_fetch {
if(req.url ~ "logout" || req.url ~ "sign_out"){
    unset beresp.http.Set-Cookie;
}
if (req.request == "GET") {
       unset beresp.http.Set-Cookie;
       set beresp.ttl = 360m;
}

if (req.url ~ "images/" || req.url ~ "javascripts" || req.url ~ "stylesheets" || req.url ~ "assets"){
       set beresp.ttl = 360m;
}
}

/etc/default/ニス

DAEMON_OPTS="-a 192.241.136.37:80 \
         -T localhost:6082 \
         -f /etc/varnish/default.vcl \
         -S /etc/varnish/secret \
         -s malloc,256m"

/etc/nginx/sites-enabled/default

 upstream app {
  server unix:/tmp/unicorn.socket fail_timeout=0;
}

server {
listen 80;
client_max_body_size 2G;
server_name localhost;
keepalive_timeout 5;
root /home/deploy/apps/wms/current/public;
access_log  off;
error_log off;

if ($request_method !~ ^(GET|HEAD|PUT|POST|DELETE|OPTIONS)$ ){
    return 405;
}

location ~ ^/(assets)/  {  
    gzip_static on;
    expires     max;
    add_header  Cache-Control public;
} 

location / {
    try_files $uri/index.html $uri.html $uri @app;
    error_page 404              /404.html;
    error_page 422              /422.html;
    error_page 500 502 503 504  /500.html;
    error_page 403              /403.html;
}

location @app {
    proxy_pass http://app;
}

location = /favicon.ico {
    expires    max;
    add_header Cache-Control public;
}

location ~ \.php$ {
    deny  all;
}

}
4

1 に答える 1

1

バックエンドがセッション Cookie を削除できないようにしているため、ブラウザの Cookie を明示的に削除しない限りログアウトできません。

フェッチ VCL (コメント インライン) を見ると、次のようになります。

sub vcl_fetch {
  # This prevents server from deleting the cookie in the browser when loging out
  if(req.url ~ "logout" || req.url ~ "sign_out"){
    unset beresp.http.Set-Cookie;
  }
  if (req.request == "GET") {
    unset beresp.http.Set-Cookie;
    set beresp.ttl = 360m;
  }
  if (req.url ~ "images/" || req.url ~ "javascripts" || req.url ~ "stylesheets" || req.url ~ "assets"){
    set beresp.ttl = 360m;
  }
}

したがって、POST リクエストの結果でない限り、バックエンドはクライアントの Cookie を削除できません。

IMHO バックエンドの Set-Cookie ヘッダーをいじってはいけません。考えられる副作用を知っている (そして十分にテストしていない) 場合を除きます。

于 2013-08-28T19:57:20.950 に答える