2016-11-15 6 views
1

symfoniers! 나는 알 수없는 문제가 있는데, 내가 잘못한 것을 발견 할 수 없다. symfony 2.3에서 sylius 0.11 버전, nginx 1.10, varnish 4.1, php5.5를 사용하고 있습니다.Symfony : 고객이 외국 컴퓨터에 로그인

우리가 설정 준비를 할 때 새로운 설정의 바니시가 좋았습니다. 그러나 그때 우리는 "내 계정에 로그인했지만 다른 사용자에게있어!"와 같은 실망스러운 코멘트를 남겼습니다. 우리는 우리의 광택을 끄고 nginx 설정을 롤백합니다. 그러나 문제는 여전히 우리를 쫓고있었습니다.

우리는 바니쉬가 세션 메커니즘을 깨뜨 렸다고 생각했기 때문에 캐시의 모든 세션을 삭제하기로 결정했습니다. 그것은 우리를 돕는 것처럼 보입니다. 그러나 우리는 확실히 모른다.

그런 다음 바니시 구성을 수정하고 다시 시도하십시오. 같은 문제.

어떻게 다른 사용자에게 기록의 문제를 결정 : 이와 관련

, 나는이 개 질문이? 이 문제의 근본 원인은 무엇입니까? 누군가가 어떤 해결책을 제안 할 수 있습니까?

우리의 광택 설정 :

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 설정 - 쿠키 헤더입니다. 우리는이

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. 그런 다음 캐시 키를 생성하라는 요청을 해싱하면 방금 제거한 것과 동일한 쿠키를 사용하려고 시도합니다.

일반적으로 첫 번째 단계는 백엔드 동작을 변경하지 않으므로 캐시 키에서 쓸모없는 프런트 엔드 쿠키를 제거하기 위해 수행됩니다.

이것은 기본적으로 바니시가 쿠키로 요청을 캐시하지 않기 때문에 수행됩니다 (builtin.vcl에서 볼 수 있음).

vcl_hashvcl_recv에 쿠키 처리 라인을 제거해야한다고 생각합니다. 이렇게하면 문제가 해결되지만 쿠키로받은 모든 요청은 PASS (캐싱되지 않음)에 저장됩니다. 쿠키가 있어도 일부 요청을 캐시하려면 실제로 처리해야합니다 ( ). vcl recv에서 쿠키가 설정되지 않은 경우 쿠키를 설정 해제하고 응답을 변경하면 해시를 반환합니다. . vcl_hash에서 해시 매개 변수에 가치가있는 쿠키를 추가하십시오.

또한 귀하의 예에서는 정규식 ;[^ ][^;]*이 너무 공격적이며 모든 쿠키를 삭제한다고 생각합니다.

+0

쿠키는 기본적으로 제거 만 가능합니다. 자신 만의 ** sub vcl_hash **를 작성하면 모든 것을 해시 할 수 있습니다. 이상으로, beresp에 저장된 모든 정보는 캐시에 재고가 있습니다. http 헤더, URL, 상태 등이 있습니다. ** varnishlog -i BerespHeader **를 작성하고 모든 정보를 볼 수 있습니다. 다른 정보를 보려면 * man vsm * –

+0

당신 말이 맞습니다. "vcl_hash에서 해시 매개 변수에 가치가있는 쿠키를 추가하십시오."라는 문장을 사용하여 표현하고 싶었습니다. –