[http] Cache-Control : max-age = 0과 no-cache의 차이점은 무엇입니까?

헤더 Cache-Control: max-age=0는 내용이 즉시 오래된 것으로 간주되며 다시 가져와야 함을 나타냅니다 Cache-Control: no-cache.



답변

나는이 같은 질문을했고 내 검색에서 일부 정보를 찾았습니다 (귀하의 질문은 결과 중 하나였습니다). 여기 내가 결정한 것이 있습니다 …

Cache-Control헤더 에는 양면이 있습니다 . 한쪽은 웹 서버 (일명 “원본 서버”)가 보낼 수있는 곳입니다. 다른 쪽은 브라우저 ( “사용자 에이전트”)가 보낼 수있는 곳입니다.


오리진 서버가 보낸 경우

저는 믿습니다 max-age=0단순히 응답에서 부실 캐시 (사용자 에이전트) 알려주는 GET-가서 그들은 있도록 해야한다 응답을 재 검증 (예.와 If-Not-Modified헤더) 캐시 된 복사본을 사용하기 전에, 반면 no-cache그들에게 말한다 해야 캐시 된을 사용하기 전에 재 검증 부. 14.9.1 부터 : 캐시 가능한 것 :

캐시하지 않음

… 캐시는 원래 서버와의 재확인없이 후속 요청을 만족시키기 위해 응답을 사용해서는 안됩니다. 이를 통해 오리진 서버는 클라이언트 요청에 부실 응답을 리턴하도록 구성된 캐시로도 캐싱을 방지 할 수 있습니다.

즉, 캐시는 때로는 부실 응답을 사용하도록 선택할 수 있지만 (그런 다음 Warning헤더 를 추가해야한다고 생각 하지만) no-cache부실 응답을 사용할 수는 없습니다. 아마 당신은 싶어 SHOULD 야구 통계가 페이지에서 발생하는 경우 -revalidate 동작을, 그러나 당신은 싶어 MUST 당신이 전자 상거래 구매에 대한 응답을 생성 한 경우 -revalidate 동작을.

no-cache스토리지를 막을 수 없다고 말했을 때 귀하의 의견은 정확하지만 실제로는를 사용할 때 다른 차이가있을 수 있습니다 no-cache. Cache Control Directives Demystified 페이지를 보았습니다 . (정확성을 보증 할 수는 없습니다)

실제로 IE와 Firefox는 no-cache 지시문을 브라우저가 페이지를 캐시하지 않도록 지시하는 것처럼 처리하기 시작했습니다. 약 1 년 전에이 동작을 관찰하기 시작했습니다. 캐싱을 방지하기 위해이 지시문을 광범위하게 (잘못) 사용하여이 변경이 발생한 것으로 의심됩니다.

최근에 “cache-control : no-cache”도 “no-store”지시문처럼 동작하기 시작했습니다.

제쳐두고, Cache-Control: max-age=0, must-revalidate기본적으로와 같은 것을 의미하는 것으로 보입니다 Cache-Control: no-cache. 그래서 어쩌면이 얻을 수있는 방법이다 MUST 의 -revalidate 동작 no-cache의 명백한 마이그레이션을 피하면서, no-cache같은 일을하고에 no-store(예. 아니오 전혀 캐시)?


사용자 에이전트가 보낸 경우

shahkalpesh의 답변 이 사용자 에이전트 측에 적용 된다고 생각 합니다. 13.2.6 명확한 다중 응답을 볼 수도 있습니다 .

사용자 에이전트가 요청 Cache-Control: max-age=0(일명 “end-to-end revalidation”)을 보내면 경로를 따라 각 캐시는 캐시 항목 (예 : If-Not-Modified헤더)을 원래 서버로 다시 확인합니다. 응답이 304 (수정되지 않음)이면 캐시 된 엔터티를 사용할 수 있습니다.

반면에 Cache-Control: no-cache( “end-to-end reload”) 로 요청을 보내는 것은 재확인되지 않으며 서버 는 응답 할 때 캐시 된 사본을 사용 해서는 안됩니다 .


답변

최대 연령 = 0

이것은 새로 고침 을 클릭하는 것과 같습니다. 즉, 최신 사본이 없으면 최신 사본을 제공합니다.

캐시하지 않음

이것은 새로 고침을 클릭하는 동안 Shift 키 를 누르고 있습니다. 즉, 무엇이든 상관없이 모든 것을 다시 실행하십시오.


답변

오래된 질문이지만, 다른 사람이 내가 한 것처럼 검색을 통해이 문제를 발견하면 IE9 가이를 사용하여 뒤로 및 앞으로 버튼을 사용할 때 리소스의 동작을 구성하는 것으로 보입니다. 때 최대 사용 기간 = 0 사용되는 뒤로 / 앞으로 눌러에 자원을 볼 때, 브라우저는 최신 버전을 사용합니다. 캐시 를 사용 하지 않으면 리소스를 다시 가져옵니다.

IE9 캐싱에 대한 자세한 내용은이 msdn 캐싱 블로그 게시물 에서 확인할 수 있습니다 .


답변

IE8 및 Firefox 3.5를 사용한 최근 테스트에서 둘 다 RFC 호환 인 것 같습니다. 그러나 원 서버와 “친숙성”이 다릅니다. IE8은와 no-cache같은 의미로 응답을 처리합니다 max-age=0,must-revalidate. 그러나 Firefox 3.5 no-cache는에 해당하는 것으로 보이며 no-store성능 및 대역폭 사용량이 줄어 듭니다.

기본적으로 Squid Cache no-cache는 Firefox 와 같이 헤더 와 함께 아무것도 저장하지 않는 것 같습니다 .

필자 public,max-age=0는 모든 요청에서 최신 정보를 확인하려는 비 민감 리소스 를 설정 하는 것이지만 캐싱의 성능 및 대역폭 이점은 여전히 ​​허용합니다. 동일한 고려 사항을 가진 사용자 별 항목의 경우을 사용하십시오 private,max-age=0.

no-cache일부 브라우저와 인기있는 캐시에 의해 기능적으로 동등한 것으로 보이는 것처럼 보이므로 완전히 사용하지 않는 것이 좋습니다 no-store.

또한 Akamai와 Limelight를 모방하지 마십시오. 이들은 본질적으로 대규모 캐싱 어레이를 주요 비즈니스로 운영하고 전문가 여야하지만 실제로는 네트워크에서 더 많은 데이터를 다운로드하는 데 관심이 있습니다. 에뮬레이션에도 Google이 적합하지 않을 수 있습니다. 그들은 자원에 따라 사용 max-age=0하거나 no-cache무작위로 보인다 .


답변

최대 연령
    max-age = 0 지시문을 통해 중간 캐시가 강제로 재 활성화되는 경우
자체 캐시 항목 및 클라이언트가 요청에 자체 유효성 검사기를 제공했습니다.
제공된 유효성 검사기는 현재 캐시 항목과 함께 저장된 유효성 검사기와 다를 수 있습니다.
이 경우 캐시는 유효성 검사기를 사용하지 않고 자체 요청을 할 때 유효성 검사기를 사용할 수 있습니다
의미 투명성에 영향을줍니다.

    그러나 유효성 검사기를 선택하면 성능에 영향을 줄 수 있습니다. 가장 좋은 방법은
요청시 자체 유효성 검사기를 사용하기위한 중간 캐시. 서버가 응답하는 경우
304 (수정되지 않음)를 사용하면 캐시는 현재 검증 된 사본을 클라이언트에 반환 할 수 있습니다.
200 (OK) 응답으로. 서버가 새로운 엔터티 및 캐시 유효성 검사기로 응답하면
그러나 중간 캐시는 제공된 유효성 검사기와 반환 된 유효성 검사기를 비교할 수 있습니다.
강력한 비교 기능을 사용하여 클라이언트의 요청. 클라이언트의 유효성 검사기가
원본 서버와 같으면 중간 캐시가 단순히 304를 반환합니다 (Not
수정 됨). 그렇지 않으면 200 (OK) 응답으로 새 엔터티를 반환합니다.

    요청에 no-cache 지시문이 포함 된 경우 min-fresh,
최대 이야기 또는 최대 연령. 

예의 : http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

이것을 대답으로 받아들이지 마십시오-나는 그것의 실제 사용법을 이해하기 위해 그것을 읽어야 할 것입니다 🙂


답변

나는 캐싱 전문가는 아니지만 Mark Nottingham입니다. 그의 캐싱 문서 는 다음과 같습니다 . 그는 참고 문헌 섹션에 훌륭한 링크가 있습니다.

그 문서의 내 독서를 바탕으로, 그것은처럼 보이는 max-age=0캐시가 충분히 가까이 “동시에”수단이 함께 그들이 캐시에 동시 보는 “동시에”에 들어왔다 요청에 캐시 된 응답을 보낼 수 있지만, 할 수 no-cache없는 것 .


답변

그건 그렇고, 일부 모바일 장치, 특히 iPhone / iPad와 같은 Apple 제품은 캐시 없음, 저장소 없음, 만료 : 0 등의 헤더를 완전히 무시하거나 만료되지 않은 재사용을 강제로 시도 할 수있는 모든 것을 무시할 가치가 있습니다. 양식 페이지.

이로 인해 사용자의 iPad 문제, 양식 프로세스를 통해 도달 한 페이지에서 잠자기 상태 (2/3 단계) 등의 문제를 해결하려고 할 때 두통을 겪지 않았습니다. 캐시 지시문, 그리고 내가 알 수있는 한, 페이지의 가상 스냅 샷을 마지막 상태에서 가져옵니다. 즉, 명시 적으로 말한 것을 무시하고 저장해서는 안되는 페이지를 취하는 것입니다. 실제로 다시 확인하지 않고 저장하면 모든 종류의 이상한 세션 문제가 발생합니다.

누군가가 와서 특히 iPhone 및 ipad에서 세션 오류가 발생하는 이유를 알 수없는 경우에 이것을 추가하고 있습니다.이 분야에서 최악의 범죄자 인 것으로 보입니다.

나는이 문제로 상당히 광범위한 디버거 테스트를 수행했으며 이것이 내 결론이며 장치는 이러한 지시문을 완전히 무시합니다.

정기적으로 사용하더라도 일부 휴대 전화는 Expires : 0을 통해 새 버전을 확인하지 못하고 마지막으로 수정 된 날짜를 확인하여 새 버전을 가져와야하는지 여부를 확인했습니다.

그것은 단순히 일어나지 않으므로 강제로 업데이트를 수행하는 데 필요한 css / js 파일에 쿼리 문자열을 추가하는 것이 어리석은 모바일 장치가 가지고 있지 않은 파일이라고 생각하도록 속입니다. css / js 업데이트의 경우 .css? v = 1, v = 2입니다. 이것은 크게 작동합니다.

그런데 2016 년 현재 기본값을 유지하면 사용자 브라우저는 지속적으로 (사이트에 많은 변경 및 업데이트를 수행함) 해당 파일에서 마지막으로 수정 된 날짜를 확인하지 못하지만 쿼리는 실패합니다. 문자열 메서드는 해당 문제를 해결합니다. 브라우저에서 기본 일반 사용자 기본값을 사용하는 경향이 있고 CSS / JS 등의 캐싱 문제를 인식하지 못하는 클라이언트 및 사무실 직원에게이 사실을 알았습니다. 즉, 대부분의 MSIE / Firefox와 같은 브라우저의 기본값은 지시에 따라 수행하지 않고 변경 사항을 무시하고 마지막으로 수정 한 날짜를 무시하며 Expires : 0을 명시 적으로 설정하더라도 유효성을 검사하지 않습니다.

이것은 좋은 기술 정보가 많은 좋은 스레드 였지만 특히 모바일 장치 에서이 기능에 대한 지원이 얼마나 나쁜지를 주목하는 것이 중요합니다. 몇 달마다 나는 그들이받는 헤더 명령을 따르지 않거나 그 명령을 제대로 인터페이싱하지 못하도록 보호 계층을 추가해야합니다.