다양한 유형의 리소스에 이상적인 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.