2016-11-15 6 views
1

symfoniers!私は未知の問題を抱えています。私が間違ったことを見つけることはできません。 symfony 2.3については、sylius 0.11バージョン、nginx 1.10、varnish 4.1、php5.5を使用しています。symfony:お客様が海外のユーザにログイン

私たちが設定を準備しようとすると、新しいニスの設定がすべてうまくいきました。しかし、私は「私は自分のアカウントにログインしましたが、別のユーザーになってしまいました!私たちはニスをオフにし、nginxの設定をロールバックします。しかし、問題はまだ私たちを追いかけていました。

ワニスが何らかの形でセッションメカニズムを破ったと考えたので、キャッシュ内のすべてのセッションを削除することにしました。それが私たちを助けるようです。しかし、私たちは確かに分かりません。

次に、ニスの設定を修正してもう一度やり直してください。同じ問題。これに関連して

、私は2つの質問があります。

他のユーザへのロギングの問題を決定する方法を? この問題の根本はどこですか?誰かが何か解決策を提案できますか?

当社のワニスの設定:

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

    if (req.url ~ "/administration/?.*" || 
     req.url ~ "/app_dev.php/?.*" || 
     req.url ~ "/account/?.*" || 
     req.url ~ "/cart/?.*" || 
     req.url ~ "/currency/?.*" || 
     req.url ~ "/login_check/?.*" || 
     req.url ~ "/login/?.*" 
     req.url ~ "/logout/?.*" 

    ) { 
      return (pass); 
    } 

    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, ";(ProductsViewMode|PHPSESSID|currency|APP_REMEMBER_ME|recentViews|mobile)=", "; \1="); 
     set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", ""); 
     set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", ""); 

     if (req.http.Cookie == "") { 
      unset req.http.Cookie; 
     } 
    } 

    #all pictures cache by 15 minutes 
    if (req.url ~ "^.*\.(png|jp[e]?g|gif|swf|css|js|svg)?(\?v=.*)?$") { 
     unset req.http.Cookie; 
#  set req.ttl = 900s; 
     return (hash); 
    } 

    #clear all cache content 

    if (req.method == "PURGE") { 
     if (!client.ip ~ invalidators) { 
      return (synth(405, "Not allowed")); 
     } 
     return (purge); 
    } 
return (hash); 
} 

sub vcl_hash { 

    #unset req.http.Cookie; 

    set req.http.X-Have-To-Hash = ";" + req.http.Cookie; 
    set req.http.X-Have-To-Hash = regsuball(req.http.X-Have-To-Hash, "; +", ";"); 
    set req.http.X-Have-To-Hash = regsuball(req.http.X-Have-To-Hash, ";(ProductsViewMode|currency|recentViews|mobile)=", "; \1="); 
    set req.http.X-Have-To-Hash = regsuball(req.http.X-Have-To-Hash, ";[^ ][^;]*", ""); 
    set req.http.X-Have-To-Hash = regsuball(req.http.X-Have-To-Hash, "^[; ]+|[; ]+$", ""); 

    if (req.http.Cookie ~ "APP_REMEMBER_ME") { 
     set req.http.X-Have-User = "true"; 
    } else { 
     set req.http.X-Have-User = "false"; 
    } 

    hash_data(req.url); 
    hash_data(req.http.host); 
    hash_data(req.http.X-Have-To-Hash); 
    hash_data(req.http.X-Have-User); 

    return (lookup); 

} 


sub vcl_backend_response { 

    #for ban some objects 
    set beresp.http.X-Url = bereq.url; 
    set beresp.http.X-Host = bereq.http.host; 

    if (beresp.http.Cache-Control ~ "private" || 
     beresp.http.Cache-Control ~ "no-cache" || 
     beresp.http.Cache-Control ~ "no-store" 
    ) { 
     set beresp.ttl = 1h; 
#  set beresp.uncacheable = true; 
     unset beresp.http.Cache-Control; 
    } 

    if (beresp.http.X-Url ~ "^.*\.(png|jp[e]?g|gif|swf|css|js|svg)?(\?v=.*)?$") { 
     set beresp.ttl = 24h; 
    } 

    if (beresp.status == 502 || beresp.status == 404 || beresp.http.X-Cache-Debug) { 
     set beresp.ttl = 0s; 
    } 

return (deliver); 
} 

弊社のセキュリティ設定:

# This file is part of the Sylius package. 
# (c) Paweł Jędrzejewski 

security: 
    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username 
    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 
    firewalls: 
     administration: 
      switch_user: true 
      context:  user 
      pattern:  /administration/.* 
      form_login: 
       provider:  fos_userbundle 
       login_path: /administration/login 
       check_path: /administration/login-check 
       failure_path: /administration/login 
       default_target_path: /administration/dashboard 
       use_forward: false 
       use_referer: true 
      logout: 
       path: /administration/logout 
       target: /administration/login 
      anonymous: true 

     main: 
      switch_user: { role: ROLE_SYLIUS_ADMIN } 
      context:  user 
      pattern:  /.* 
      form_login: 
       provider: fos_userbundle 
       login_path: /login 
       check_path: /login_check 
       success_handler: authentication_handler 
       failure_handler: authentication_handler 
       failure_path: /login 
       default_target_path:/
       use_forward: false 
       use_referer: true 
      remember_me: 
       key: %sylius.secret% 
       name: APP_REMEMBER_ME 
       lifetime: 31536000 
       always_remember_me: true 
       remember_me_parameter: _remember_me 
      oauth: 
       resource_owners: 
        facebook: "/login/check-facebook" 
        vk: "/login/check-vkontakte" 
        twitter: "/login/check-twitter" 
        google_plus: "/login/check-google" 
       login_path: /login 
       failure_path: /login 
       default_target_path: /account/profile 
       oauth_user_provider: 
        service: ostrov_user_provider 
      logout: true 
      anonymous: true 

     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 

    access_control: 
     - { path: ^/login.*, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/connect.*, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: /api/checkauth.*, role: IS_AUTHENTICATED_ANONYMOUSLY } 

     - { path: ^/administration/login, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/administration/login-check, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: "/administration.*", role: ROLE_SYLIUS_ADMIN } 
     - { path: /api.*, role: ROLE_API } 

     - { path: "/account.*", role: ROLE_USER } 
     - { path: "/account.*", role: ROLE_MANAGER } 

     - { path: "/_partial.*", ip: 127.0.0.1 } 

    role_hierarchy: 
     ROLE_MANAGER:  [ROLE_USER] 

そして、もう一つの質問:どのようにsession_start()セッションIDを与えますか? PHPSESSIDをどのように利用するのか?存在しているsess_idをチェックして、nginxのリロードかサーバーが別のサーバーになった場合、sessをリセットしますか?クッキーを使用してワニスVCLあなた混乱して

答えて

0

だから、問題は何だった:私たちは、すべてのページをキャッシュされた

ので、誰かのページcontaints のSet-Cookieヘッダ。私たちはこの

if (beresp.status > 400 || 
    beresp.http.X-Cache-Debug || 
    beresp.http.Set-Cookie ~ "PHPSESSID" 
) { 
     set beresp.ttl = 0s; 
    } 

にこのライン

if (beresp.status == 502 || beresp.status == 404 || beresp.http.X-Cache-Debug) { 
    set beresp.ttl = 0s; 
} 

を修正した後、それですべてが大丈夫になりました。

これは誰かに役立つことを願っています。がんばろう!

0

  1. ワニスは、それが正規表現を使用して、いくつかのクッキーを削除する要求を受信します。
  2. キャッシュキーの作成要求をハッシュすると、削除したのと同じCookieを使用しようとします。

通常、最初の手順は、バックエンドの動作を変更しないため、キャッシュキーでは役に立たないフロントエンドCookieを削除するために行われます。

これは、ワニスが基本的にクッキーでリクエストをキャッシュしないためです(これはbuiltin.vclに記載されています)。

vcl_hashvcl_recvのCookie処理行を削除する必要があります。これで問題は解決するはずですが、クッキーで受け取ったリクエストはPASS(キャッシュされません)になります。クッキーがあっても実際にはいくつかのリクエストをキャッシュしたい場合は、いくつかの処理を行うべきです: 。 vcl recvでは、値が設定されていない場合はCookieを解除し、応答を変更する場合はハッシュを返します。 。 vcl_hashでは、ハッシュパラメータに価値のあるクッキーを追加します。

さらに、あなたの正規表現;[^ ][^;]*はあまりにも積極的で、すべてのCookieを削除すると思います。

+0

Cookieは、デフォルトでのみ削除できます。独自の** sub vcl_hash **を書くと、すべてをハッシュできます。 さらに、berespのすべての情報にキャッシュ内の在庫が含まれています。 httpヘッダー、URL、ステータスなどがあります。 ** varnishlog -i BerespHeader **と書いて、すべての情報を見ることができます。別の情報を見るには、* man vsm * –

+0

を参照してください。これは、「vcl_hashでは、ハッシュパラメータに価値のあるCookieを追加する」という文を使用して表現したかったものです。 –

関連する問題