2011-10-13 5 views
4

renderBinary()로 일부 정적 리소스의 게재를 사용자 정의하려고합니다. 인증을 옵션으로 점검하고 적절한 파일을 제공하는 컨트롤러를 통해 이러한 자산을 제공하고 싶습니다. 변경하지 않기 때문에 1 년 동안 일부 파일을 캐시하고 싶습니다. renderBinary를 사용하는 경우renderBinary 응답 캐싱

public static void item(String item) { 
      // check authorization ... 
      response.cacheFor("365d"); 
      renderBinary(Play.getFile("static/" + item)); 
    } 

나는 데 문제가 자동으로 재생 Etag입니다 및 캐시는 1 시간을 추가, 그래서 그물 효과는 을한다는 것입니다 :

내 컨트롤러 방법은 다음과 같이 보입니다 firefox는 재생 서버에서 응답을 얻기 위해 필요할 때이 파일들을 다시 요청합니다.

은 내가 프론트 엔드 등의 nginx와 함께 일을 얻을 수 있습니다 알고 있지만 재생 사용하여 을하고 싶습니다. 재생의 캐시는 서버 캐시이며 TEH 브라우저 (304 항목에 답) 자세한 내용은 서버를 확인하는대로

답변

1

당신은 304 답을 피할 수 없다. 캐시가 잘 보이고 다시 검색되지 않기 때문에 캐시가 제대로 작동하는지 보여줍니다. 그러나 캐시가 손실 될 수 있습니다 (항목이 오래되어 캐시 정책에 의해 제거 된 경우) 요청이 항목을 다시로드 할 수 있습니다.

유일한 해결책은 일년에 ETag를 변경하는 것입니다. application.conf에는 캐시 시간을 설정할 수있는 http.cacheControl이라는 속성이 있습니다. 기본값은 1 시간으로 설정되지만 1 년으로 설정되지만 모든 항목에 적용됨을 알고 있어야합니다 (예를 들어 자바 스크립트 파일을 변경하면 이름을 더 잘 변경하십시오!)

+0

안녕 Pere. Last-Modified 및 Expires 헤더를 설정하여 최소한 304는 피할 수 있지만이 경우에는 제대로 지원되지 않는 것 같습니다. 많은 사이트가 최대 사용 기간은 동일한 작업을 수행해야한다고 주장하지만, 내 파이어 폭스 어쨌든 ... 을 무시하고 요청을-문제를 다시 것, 내가 연극 소스를 사용자 정의하거나 어쩌면위한 모듈을 만들려고 할 것 같다 캐싱 구성 중 ... – user744959

+1

@ user744959 예, 서버 캐시 (응답 cache.For)에 의존하는 경우 서버 캐시를 생성 할 때 브라우저에이를 저장하도록 요구하는 304가있을 것입니다. 당신이 원하는 방식으로 (이론적으로) 내가 두 번째 단락에서 말하는, ETag 수명을 연장하기 위해 http.cacheControl 속성을 설정해보십시오. –

+0

확인. 내가 cacheFor 그냥 브라우저 헤더를 설정, 그게 내가 컨트롤러에서 설정 헤더를 무시하는 것으로 보인다 생각. 나는 nginx 프론트 엔드를 사용하여 주위에 얻을 수 있지만 단지 간단한 필요에 대한 복잡하고 복잡한 것 같습니다 ... – user744959