2010-11-25 9 views
16

광택이있는 상태에서도 특정 페이지를 캐시하고 싶습니다. 익명의 사용자가 빛 정의와 일부 페이지를 보는 사용자에 바니시를 무시하는 방법, 쿠키를 삭제하지 않는 방법

  • A가 기록 된 어떤 페이지를보고

    1. : 내가 알아서해야 할 3 가지 가능성이 있습니다. 이러한 사용자 정의는 모두 서명 된 쿠키에 저장되며 Javascript에 의해 동적으로 채워집니다. vary-cookie http 헤더가 설정되지 않았습니다.
    2. 로그인 한 사용자가 데이터베이스의 사용자 정의 된 데이터로 일부 페이지를보고 있습니다. 다양한 쿠키 http 헤더가 설정됩니다.

    예상되는 행동은 다음과 같습니다

    1. 캐시 페이지. 이것은 바니시가 처리 할 수있는 가장 기본적인 시나리오입니다.
    2. 페이지를 캐시하고 일부 자바 로직에 필요하기 때문에 쿠키를 삭제하지 마십시오.
    3. 다양한 쿠키가 쿠키 내용이이 페이지의 출력에 영향을 미치기 때문에이 페이지를 캐시하지 마십시오.

    Varnish에서 일부 문서를 읽었으며 이것이 기본 동작인지 또는 VCL에서 수행해야 할 설정이 있는지 확인할 수 없습니다.

  • +1

    크로스 사이트 게시로 마감 됨 : http://serverfault.com/q/205768/72348 – casperOne

    답변

    17

    세션 만 모든 클라이언트에 고유하며 쿠키가 반드시 필요하지는 않습니다.

    바니시로 원하는 것이 의미가 있으며 가능한 것은 신중하게 자신의 vcl을 만드는 것입니다. default.vcl의 다음 부분에주의하십시오 :

    sub vcl_recv { 
        ... 
        if (req.http.Authorization || req.http.Cookie) { 
         /* Not cacheable by default */ 
         return (pass); 
        } 
    } 
    
    
    sub vcl_hit { 
        if (!obj.cacheable) { 
         return (pass); 
        } 
        ... 
    } 
    
    
    sub vcl_fetch { 
        if (!beresp.cacheable) { 
         return (pass); 
        } 
        if (beresp.http.Set-Cookie) { 
         return (pass); 
        } 
        ... 
    } 
    

    을 당신은 당신의 자신의 논리와 이들 부품을 교체해야; 즉, 자신의 vcl_ 함수를 정의하십시오. 기본적으로 쿠키가있는 요청 (vcl_recv) 및 응답 (vcl_fetch)은 캐시 할 수 없습니다. 백엔드 어플리케이션을 가장 잘 알고 있으며 일반 캐시 로직을이 특별한 경우로 다시 작성해야합니다. 즉, 바니시가 조회, 전달 또는 전달하는 경우를 정의해야합니다.

    경우에 따라 다양한 쿠키 (쿠키가 있거나없는 요청)가 캐시되고 공유되는 페이지 (사례 1 및 2)가 표시됩니다. 그냥 req.http.Cookie vcl_recv 상관 없어. 나는 다양한 쿠키 (cookie)로 페이지를 캐싱하지 않을 것입니다. 적어도 오랜 시간 동안은 캐시하지 않을 것입니다. 전혀 공유 할 수 없기 때문입니다. vcl_fetch에서 'pass'를하십시오.

    +0

    * vcl_fetch *에서 다음과 같이하고 싶습니다. * if (beresp.http.Vary ~ "Cookie") { 반환 (합격); } *. –

    +1

    예. 그리고 vcl_recv에서 기본 동작으로 돌아가서는 안되지만 req.http.Cookie가 설정된 경우에는 "even"을 참조하십시오. 애플리케이션을 완전히 이해하지 못했지만 Set-Cookie를 수행하는 응답 캐싱에주의해야합니다. 일부 쿠키 설정 (캐시하지 않음)을 수행하고 쿠키 값에 기반한 작업을 수행하는 자바 스크립트로 캐시 된 응답을 제공합니다 (클라이언트를 신뢰하는 곳을 자세히 확인하십시오). – ivy

    +0

    임 거의 여기에서 동일한 문제가 있습니다. 내 vcl_recv는 반환 (조회)으로 끝나고 vcl_fetch는 다음과 같습니다. sub vcl_fetch { \t if (req.backend == dinamic) { \t \t esi; \t} \t if (req.백엔드 == 정적) { \t \t unset beresp.http.set-cookie; \t}}하지만 여전히 다이나믹 백엔드 (캐시되어야 함)에 대한 모든 요청은 ... 어떤 생각입니까? 나는 esi를 사용하여 사용자 정의 캐싱을 만들려고 노력하고 있지만, 니스가 응용 프로그램 출력에서 ​​오는 내용을 캐싱하지 않기 때문에 쓸모 없게됩니다. – Tiago