2011-06-14 7 views
19

다음 상황에서 HTTP 캐시 헤더를 구성하는 데 문제가 있습니다.HTTP : 만료 및 유효성 검사 캐싱 결합

Google 서버에는 일주일에 몇 번씩 큰 데이터가 변경됩니다. 브라우저에서이 데이터를 캐시해야합니다. 또한 네트워크를 신뢰할 수 없으므로 조건부 수신 대기 시간을 최소화하고 싶습니다.

난 후 최종 동작은 이것이다 :

  1. 클라이언트가 이전에 본 적이없는 리소스를 요청합니다.
  2. 서버는 ETag 및 max-age (24 시간)과 함께 리소스로 응답합니다.
  3. 24 시간이 경과 할 때까지 클라이언트는 캐시 된 리소스를 사용합니다. 만료일 후
  4. , 클라이언트는 유효성 검사 요청을 수행합니다 (If-None-Match: [etag])
  5. 리소스가 변경되지 않은 경우 : 304 Not Modified
  6. 클라이언트가 어떻게 든 기존의 자원이 새로운 만료을 가지고 통보와 함께
    • 서버는 응답 날짜를 지금부터 24 시간
    • 반환 단계 3

아래로 요약하면 ... 304 응답에 새로운 max-age이 포함될 수 있습니까? 아니면 원래의 max-age이 후속 요청에 대해 존경 받습니까?

답변

29

예, 304 응답에는 새로운(또는 해당 문제의 다른 응답 헤더)가 포함될 수 있습니다.

파이어 폭스 4를 사용하여 원래의 최대 연령 또는 새로운 것이 적용되는지 테스트 한 결과, 새로운 max-age이 존중된다는 답변을 얻었으므로 원하는 것을 구현할 수 있어야합니다.

그것은 max-ageDate 응답 헤더에 상대적인 것을 기억하는 것이 중요하지 Last-Modified, 그래서 서버가 24 시간 max-age 지시, 그것은 말하는 설정 때마다 "24시간 지금부터." 따라서 원하는 것으로 가정하면 max-age을 전혀 바꿀 필요가 없습니다. 항상 86400을 돌려 주면됩니다.

어쨌든 다음은 내 실험 개요 및 덤프입니다. 기본적으로 ETag를 설정하고 max-age을 120 초로 설정 한 테스트 URL을 누르십시오. 따라서, 서버는 이러한 응답 헤더 페이지를 반환

HTTP/1.1 200 OK 
Date: Tue, 14 Jun 2011 23:48:51 GMT 
Cache-Control: max-age=120 
Etag: "901ea3d0ac9303ae4855a09676f96701" 
Last-Modified: Mon, 13 Jun 2011 22:20:03 GMT 

내가 다음 페이지를로드 (그러나 하드 다시로드를 강제하지 않음) 주소창에 "입력"타격 반복했다. Firefox는 캐시에서 페이지를 반복적으로 다시로드 했으므로 네트워크 트래픽이 없습니다. 그런 다음, 다음에 입력 할 때까지 120 초가 지나면 Firefox는 예상대로 서버에 조건부 GET을 보냈습니다. 서버에서 요청 및 응답했다 : 304 응답에서, 나는 240 120 초에서 서버 변경 max-age을 했어

GET /example HTTP/1.1 
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT 
If-None-Match: "901ea3d0ac9303ae4855a09676f96701" 

HTTP/1.1 304 Not Modified 
Date: Tue, 14 Jun 2011 23:50:54 GMT 
Etag: "901ea3d0ac9303ae4855a09676f96701" 
Cache-Control: max-age=240 

참고.

큰 질문은 120 초가 지나면 어떻게 될까요? Firefox가 새로운 max-age을 존중하고 캐시에서 페이지를 계속로드합니까, 아니면 서버에 충돌합니까? 나는 또 다른 240 초 사이클을 반복 일이 예상대로 작동

GET /example HTTP/1.1 
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT 
If-None-Match: "901ea3d0ac9303ae4855a09676f96701" 

HTTP/1.1 304 Not Modified 
Date: Tue, 14 Jun 2011 23:54:56 GMT 
Etag: "901ea3d0ac9303ae4855a09676f96701" 
Cache-Control: max-age=240 

: 대답은 캐시에서 페이지를로드 계속, 240 초에 도달 한 후 때까지 요청을 다시하지 않은 것입니다. 그래서, 잘하면 당신에 대한 질문에 대한 답변.

RFC은 연령 계산을 구현하는 방법과 다른 캐시 제어 매개 변수의 작동 방식을 설명합니다. 모든 브라우저와 프록시가 규칙을 따를 것이라는 보장은 없지만, HTTP 1.1은 꽤 오래되었고, Firefox의 기능처럼 대부분의 기능을 수행 할 것으로 기대합니다.

(주 :이 예에서 간결 들어, 나는 그런 호스트, 연결/연결 유지, 콘텐츠 인코딩/길이/유형, 사용자 에이전트 등 관련없는 헤더를 삭제 한 덤프)

+1

"I 그런 다음 주소 표시 줄에 "Enter"키를 반복해서 눌러 페이지를로드합니다 (단, 강제로 다시로드하지 마십시오). -이 실험을 직접 해보는 데 필요한 핵심 정보였습니다! 잘 연구 된 답변 주셔서 감사합니다! – roufamatic

+3

FireFox에서 설명한 내용을 재 인쇄했습니다. Chrome에서 위치 표시 줄에 'enter'를 입력해도 여전히 304가 발생했습니다. 다른 페이지 (예 : google.com)로 이동 한 다음 뒤로 버튼을 누르면 원하는대로 캐시 동작이 표시됩니다. (흥미롭게도 "앞으로"버튼을 통해 내 페이지로 이동하면 항상 캐시 된 파일이 표시됩니다.) – roufamatic

+0

감사합니다. Chrome에 좋은 정보입니다. 당신이 테스트하는 경우 가장 중요한 것은 사용자가 무엇을 하든지, 링크를 클릭하는 것, 북마크 (직접 트래픽)를 클릭하는 것 (리퍼러 데이터에서 추정 할 수있는 것)을 시뮬 레이팅하려고하는 것입니다. 둘 다 유효한 캐시에서로드됩니다). 그리고 브라우저로 분해하십시오. 또는 Firefox/Chrome을 신뢰하고 원하는 방식으로 HTTP를 올바르게 구현하고 있다는 것을 기쁘게 생각하십시오. – joelhardi

관련 문제