2013-10-04 2 views
1

바니시를 사용하여 특정 사용자 텍스트와 링크가있는 페이지를 캐시하려고합니다. 이러한 페이지를 캐시하는 가장 좋은 방법은 Edge Side Includes입니다.Varnish에서 사용자 별 컨텍스트를 포함하도록 ESI URL을 조작하는 방법은 무엇입니까?

상황

내 웹 응용 프로그램은 편안하고 있으며 그 문제에 대한 세션 또는 쿠키를 지원하지 않습니다. 모든 소스 URL은 고유 한 사용자를 식별 할 수있는 사용자 별 쿼리 매개 변수를 포함한다는 의미에서 완전합니다. 웹 응용 프로그램에서 가장 많이 방문한 페이지는 목록 페이지입니다. 헤더에 사용자의 이메일을 표시하면되며 페이지의 링크는 로그인 된 동작을 시뮬레이션하기 위해 미리 사용자 별 검색어 매개 변수를 가져와야합니다. 페이지 내용은 헤더 및 내부 링크를 제외하고 각 사용자마다 동일해야합니다.

페이지의 해당 영역에 <esi:include />을 사용하려했지만 분명히 페이지 소스에 사용자 특정 매개 변수를 포함 할 수 없었습니다. 그렇지 않으면 첫 번째 사용자 특정 적중이 첫 번째 사용자의 매개 변수로 캐시되고 모든 후속 사용자). 더구나 나는 바니시의 vcl_recv 서브 루틴에서 사용자 특정 매개 변수를 제거하고 lookup 직전에 req.http.X-User과 같은 헤더에 일시적으로 저장하려고했습니다. 각 원본 URL은 사용자 지정 매개 변수가 없으므로 각 고유 사용자에 대해 중복 캐시 개체를 만들지 않는 req.url으로 해시됩니다.

질문

내가 쿼리 매개 변수로 각 ESI URL에 대해이 사용자 특정 값을 추가하여 req.http.X-User 및 해시 사용자 특정 ESI 요청에서 사용자 특정 매개 변수를 읽고 싶습니다

. 소스 요청과 포함 된 ESI 요청간에 쿼리 매개 변수를 공유 할 수있는 방법이 없습니다. 누군가 도움을 줄 수 있습니까?

I는 아래 그림에 내 목표를 묘사하는 것을 시도했다 : enter image description here

+0

이 문제에 대한 해결책을 찾을 수 있었습니까? – tmueller

답변

0

나는 당신의 문제는 ESI 자체가 캐시 할 것입니다 부르는 것 같다. URL에 검색어 문자열을 포함합니다.

구체적인 내용은 기억이 나지 않지만 바니시가 ESI 요청을 통해 쿠키를 전달할 수 있으므로 쿠키 (암호화 된)에 값을 저장할 수 있고 ESI를 처리하는 모든 것을 통해 읽을 수 있다고 생각합니다. 요구.

아니면 HTTP 헤더를 전달할 수 있습니까? 어떤 경우에는 HTTP 헤더 매개 변수에서 직접 읽을 수 있습니다

+0

ESI fetch는 상위 페치와 독립적이므로 부모 페치 중에 설정된 헤더를 볼 수 없습니다. 그래서 ESI 가져 오기에서 부모 가져 오기 중에 설정된 HTTP 헤더를받을 수 없습니다. 나는 ESI 요청에 매개 변수/헤더를 설정할 수있는 솔루션을 찾고있다. – rhetonik

+0

http://stackoverflow.com/questions/17704712/varnish-and-esi-http-auth 유용 할 수 있습니다. – cowls

+0

고마워요! 이것은 어느 정도 유용합니다. 그러나 고정 된 Authorization 헤더를 설정해야합니다. 필자의 경우 헤더는 상위 요청 자체에서 권한 부여를 상속해야합니다. Earn 매개 변수 허용에 대해 더 알고 싶으면 Varnish의 소스 코드를 살펴 보겠습니다. – rhetonik