다양한 유형의 리소스에 이상적인 HTTP 캐시 제어 헤더


82

"모든"캐시 및 브라우저에서 작동하는 최소한의 헤더 세트를 찾고 싶습니다 ( HTTPS를 사용할 때도 마찬가지입니다 !).

내 웹 사이트에는 세 가지 종류의 리소스가 있습니다.

(1) 영구 캐시 가능 (공개 / 모든 사용자에 대해 동일)

예 : 0A470E87CC58EE133616F402B5DDFE1C.cache.html ( GWT에 의해 자동 생성됨 )

  • 이러한 파일은 콘텐츠가 변경 될 때 자동으로 새 이름이 지정됩니다 (MD5 기준).

  • HTTPS를 사용하는 경우에도 가능한 한 많이 캐시되어야합니다 (그래서 Cache-Control: public특히 Firefox의 경우를 설정해야한다고 가정합니다 .)

  • 콘텐츠가 변경된 경우 클라이언트가 유효성을 검사하기 위해 서버로 왕복 할 필요가 없습니다.

(2) 가끔 변경 (공개 / 모든 사용자에 대해 동일)

예 : index.html, mymodule.nocache.js

  • 이러한 파일은 사이트의 새 버전이 배포 될 때 URL을 변경하지 않고 콘텐츠를 변경합니다.

  • 캐시 할 수 있지만 매번 유효성을 다시 확인하려면 왕복이 필요할 수 있습니다.

(3) 각 요청에 대한 개별 (개인 / 사용자 별)

예 : JSON 응답

  • 이러한 리소스는 어떠한 경우에도 암호화되지 않은 상태로 디스크에 캐시되어서는 안됩니다. (캐시 될 수있는 몇 가지 특정 요청이있을 수 있습니다.)

각 유형에 대해 어떤 헤더를 사용할 지에 대한 일반적인 아이디어가 있지만 항상 누락 될 수있는 것이 있습니다.


귀하의 답변과 의견 및 링크에 감사드립니다. 나는 여전히 약간의 실험을하고 있지만, 해결책을 도출 할 수있을 것이라고 생각합니다!
— Chris Lercher 2010-06-15

2
3 위 달성은 일반적으로 불가능합니다.
— EricLaw 2011

답변:


90

아마도 다음 설정을 사용합니다.

  1. Cache-Control: max-age=31556926– 표현은 모든 캐시에 의해 캐시 될 수 있습니다. 캐시 된 표현은 1 년 동안 새로운 것으로 간주됩니다.

    응답을 "만료되지 않음"으로 표시하기 위해 오리진 서버는 응답이 전송 된 후 약 1 년 후에 만료 날짜를 보냅니다. HTTP / 1.1 서버는 향후 1 년 이상 만료 날짜를 보내면 안됩니다.

  2. Cache-Control: no-cache– 모든 캐시에서 표현을 캐시 할 수 있습니다. 그러나 캐시는 캐시 된 복사본을 릴리스하기 전에 유효성 검사를 위해 원본 서버에 요청을 제출해야합니다.
  3. Cache-Control: no-store – 캐시는 어떤 조건에서도 표현을 캐시해서는 안됩니다.

자세한 내용은 Mark Nottingham의 캐싱 자습서 를 참조하십시오 .


1
@Gumbo : 제가 확신하는 한 가지는 , HTTPS를 사용하는 동안 Firefox 3+가 공용 파일을 디스크에 캐시하도록하려면 public 을 설정해야한다는 것입니다 . stackoverflow.com/questions/174348/…
— Chris Lercher

2
IE와 같은 일부 브라우저는 Cache-Control : no-cache를 저장소가없는 것처럼 취급하기 시작했습니다. 이것은 RFC에 따른 것은 아니지만, 민감한 데이터가 디스크에 암호화되지 않은 상태로 저장되는 것을 방지하기 위해 캐시를 사용하지 않는 많은 사람들이 저지른 실수를 고의로 "수정"하기위한 것입니다.
— AviD 2010 년

1
@chris_l, 나는 palisade.plynt.com/issues/2008Jul/cache-control-attributes 링크를 통해 발생했습니다 . IE7도이 작업을 수행했다고 생각하지만 이전 버전이 어떻게 작동했는지는 기억이 나지 않습니다.
— AviD 2010-06-12

2
또한 Firefox는 HTTPS 리소스를 캐시하기 위해 더 이상 Cache-Control에서 PUBLIC을 요구하지 않습니다. 그러나 전체적으로 가장 좋은 방법은 트래픽을 보면서 사이트를 테스트하는 것입니다 (예 : Fiddler).
— EricLaw 2011

3
캐시 제어 값을 100 년으로 설정하는 것은 권장되지 않습니다. 먼저 사양은 최대 1 년을 권장합니다. 둘째, 68 년 이상의 모든 값은 IE8 이하에 대해 즉시 만료됩니다. blogs.msdn.com/b/ieinternals/archive/2010/01/26/…
— EricLaw 2011

-2

사례 1과 2는 실제로 동일한 시나리오입니다. Cache-Control: public사이트의 빌드 번호 / 버전이 포함 된 URL을 설정 하고 생성하여 잠재적으로 영원히 지속될 수있는 변경 불가능한 리소스를 갖도록해야합니다. 또한 Expires클라이언트가 최신 성 검사를 발행 할 필요가 없도록 헤더를 1 년 이상 앞으로 설정하려고합니다 .

사례 3의 경우 최대 유연성을 위해 다음을 모두 수행 할 수 있습니다.

"Cache-Control", "no-cache, must-revalidate"
"Expires", 0
"Pragma", "no-cache"

새 빌드에 대한 다른 URL은 옵션이 아닐 수 있습니다. a) 이렇게하면 클라이언트가 영구 캐시 가능한 파일을 다시 다운로드해야합니다. 이를 피하기 위해 고유 한 이름을 얻습니다. b) 내 사이트의 기본 URL은 https://www.example.com/c) 북마크가 항상 내 사이트의 최신 버전을 참조하기를 원합니다 (예를 들어 stackoverflow 질문에 대한 북마크에 사이트의 빌드 번호가 포함되어 있음).
— 크리스 Lercher

안녕하세요 Chris,이 접근 방식은 일반적으로 문서보다는 CSS 및 JS 리소스에 사용됩니다. 문서 식별자에는 적용되지 않는다는 데 동의합니다.이 경우 헤더에 캐시 제어 공개, Last-Modified 및 etag를 설정하면 매번 새로 고침을 확인하고 변경 사항이 없으면 304 만 다시 전송됩니다. 마지막 다운로드 이후. 또는 JS를 통해 각 페이지의 실제 동적 페이지 콘텐츠를 다운로드하여 효과적인 캐싱을 허용하면서 URL을 유지할 수 있습니다.
— Andrew L

그렇습니다. GWT가이를 처리합니다. 내 index.html (가끔 변경됨)에는 mymodule.nocache.js (가끔 변경됨)가 포함되어 있으며 영구 캐시 가능한 파일 (js의 많은 부분, GWT 관리)이 자동으로 포함됩니다. 이미지 번들, ...) 나에게 남겨진 유일한 것은 각 유형에 대해 올바른 http 헤더를 설정하는 것입니다. 이 헤더는 전송량의 많은 부분을 차지하기 때문에 최소한으로 줄이고 싶습니다. 예를 들어 Last-Modified 와 ETag 등이 모두 필요 합니까?
— Chris Lercher

"Expires"는 실제로 숫자 0이 아닌 날짜 여야합니다. "Date"헤더와 동일한 값을 가져야합니다. mnot.net/cache_docs
— Luke Hutchison
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.