2017-02-24 4 views
0

바니시를 처음 사용하십시오. . 니스를 사용하여, 몇 시간 전에 개발, 나는 약간의 PHP 코드를 개선하기 위해 노력하고있어쿠키로 바니시 캐싱

:-(예상보다 더 열심히 점점 이 코드는 두 쿠키를 사용합니다 : PHPSESSID 및 언어

모든 페이지 설정 .이 정의되어 있지 않은 경우 PHPSESSID 쿠키 그러나 익명 세션이 쿠키는 단지 한 페이지에 사용되는

의 내가 페이지 1, 페이지 2, 페이지 3 및 Page4 있다고 가정 해 봅시다 다음과 같이 내 구성이 같아야합니다..

페이지 1, 페이지 2를 Page3는 LANGUAGE 쿠키가 필요하며 해당 쿠키와 함께 캐시되어야합니다. 하나의 캐시 fo 각 언어와 페이지.

페이지 4에는 PHPSESSID 및 LANGUAGE 쿠키가 필요하며 각 사용자별로 고유하게 캐시되어서는 안됩니다.

내 default.vlc가 제대로 작동하지 않으므로 방향이 잘못 표시 될 수 있습니다. 어쩌면 내가 놓친 몇 가지 개념을.

sub vcl_init { 

    # When requests come to Varnish I need to remove PHPSESSID so it's not used for the hash in caching. Page4 doesn't need caching as it's specific for each user: 
     if (req.http.host ~ "Page4") { 
     return(pass); 
     } 

    # remove PHPSESSID so pages1, 2, and 3 get cached just once for everyuser but in all languages. 

     if ((req.url !~ "page4")) { 
      set req.http.Cookie = regsuball(req.http.Cookie, "PHPSESSID=[^;]+(;)?", ""); 
     } 

    return (hash); 


    } 

나는 vcl_hash에 내가 포함되어 있으므로 언어의 쿠키와 웹 페이지를 캐시해야합니다

sub vcl_hash { 
    hash_data(req.url); 
    if (req.http.host) { 
    hash_data(req.http.host); 
    } else { 
    hash_data(server.ip); 
    } 

    # hash cookies for requests that have them 
    if (req.http.Cookie) { 
    hash_data(req.http.Cookie); 
    } 
} 

가 어떻게 그냥 PHPSESSIONID을 제거 할 수 있습니까?

sub vcl_backend_response { 
    # Called after the response headers has been successfully retrieved from the backend. 

    if (!(bereq.url ~ "Page4")) { 
    unset beresp.http.set-cookie; 
    } 
    return (deliver); 

} 

답변

1

올바른 길을 가고 있습니다. 귀하의 질문을 이해한다면, 작동하지 않는 것은 단지 PHPSESSID를 제거하는 대신 모든 쿠키 응답 (페이지 4가 아닌 경우)을 제거한다는 것입니다.

url이 Page4가 아닌 경우 sub vcl_backend_response에서 정규식을 사용하여 phpsessionid 만 제거 할 수 있습니다. 당신이 니스 4 이상을 사용하는 경우

beresp.http.set-cookie = regsuball(beresp.http.set-cookie, "PHPSESSID=[^;]+(;)?", "") 

또는, 당신은 훨씬 쉽게 (정규 표현식에 더 이상 필요) 처리하지 쿠키를 만드는 VMOD 쿠키를 사용합니다.