소개
언급 된 모든 클라이언트 (및 프록시)에서 작동하는 올바른 최소 헤더 세트 :
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
는 Cache-Control
클라이언트와 프록시 (그리고 암시 적으로 옆에 일부 클라이언트에 의해 요구에 대한 HTTP 1.1 사양 당이다 Expires
). 이는 Pragma
선사 시대 클라이언트에 대한 HTTP 1.0 사양에 따릅니다. 이 Expires
는 HTTP 1.0 클라이언트와 프록시 1.1 사양에 따라입니다. HTTP 1.1에서 Cache-Control
우선권Expires
므로 결국 HTTP 1.0 프록시에만 적용됩니다.
와 함께 HTTPS를 통해 페이지를 제공 할 때 IE6 및 손상된 캐싱에 신경 쓰지 않으면을 no-store
생략 할 수 Cache-Control: no-cache
있습니다.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
IE6 또는 HTTP 1.0 클라이언트에 신경 쓰지 않는다면 (HTTP 1.1이 1997에 도입되었습니다) 생략 할 수 Pragma
있습니다.
Cache-Control: no-store, must-revalidate
Expires: 0
HTTP 1.0 프록시에 관심이 없다면을 생략 할 수 Expires
있습니다.
Cache-Control: no-store, must-revalidate
반면에 서버가 유효한 Date
헤더를 자동으로 포함하면 이론적으로도 생략 Cache-Control
하고 의존 할 Expires
수 있습니다.
Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0
그러나 최종 사용자가 운영 체제 날짜를 조작하고 클라이언트 소프트웨어가이를 사용하는 경우 실패 할 수 있습니다.
위에서 언급 한 매개 변수가 지정된 경우 Cache-Control
와 같은 다른 매개 변수 max-age
는 관련이 없습니다 Cache-Control
. Last-Modified
여기에 대부분의 다른 답변에 포함 된 헤더는 단지 당신이 경우 흥미로운 실제로 원하는 요청을 캐시 당신이 전혀를 지정할 필요가 없습니다.
어떻게 설정합니까?
PHP 사용하기 :
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
Java Servlet 또는 Node.js 사용 :
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.
ASP.NET-MVC 사용
Response.Cache.SetCacheability(HttpCacheability.NoCache); // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
ASP.NET 웹 API 사용 :
// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
NoCache = true,
NoStore = true,
MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString());
ASP.NET 사용 :
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
ASP.NET Core v3 사용
// using Microsoft.Net.Http.Headers
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
Response.Headers[HeaderNames.Expires] = "0";
Response.Headers[HeaderNames.Pragma] = "no-cache";
ASP 사용 :
Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.
Ruby on Rails 또는 Python / Flask 사용 :
headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.
파이썬 / 장고 사용하기 :
response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.
파이썬 / 피라미드 사용하기 :
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
Go 사용하기 :
responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.
아파치 .htaccess
파일 사용하기 :
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
HTML4 사용하기 :
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
HTML 메타 태그 및 HTTP 응답 헤더
HTML 페이지가 HTTP 연결을 통해 제공되고 헤더가 HTTP 응답 헤더와 HTML 태그 모두에 존재 하는 경우 HTTP 응답 헤더에 <meta http-equiv>
지정된 것이 HTML 메타 태그보다 우선 한다는 점을 알아야 합니다. HTML 메타 태그는 file://
URL을 통해 로컬 디스크 파일 시스템에서 페이지를 볼 때만 사용됩니다 . W3 HTML 사양 5.2.2 장 참조 . 웹 서버가 일부 기본값을 포함 할 수 있으므로 프로그래밍 방식으로 지정하지 않을 때는이 점을주의하십시오.
일반적으로, HTML 메타 태그를 지정 하지 않는 것이 좋습니다. 초보자의 혼동을 피하고 하드 HTTP 응답 헤더에 의존하십시오. 또한 특히 이러한 <meta http-equiv>
태그는 HTML5에서 유효하지 않습니다 . 만 http-equiv
에 나열된 값 HTML5 규격은 허용됩니다.
실제 HTTP 응답 헤더 확인
둘 중 하나를 확인하기 위해 웹 브라우저 개발자 도구 세트의 HTTP 트래픽 모니터에서 보거나 디버깅 할 수 있습니다. Chrome / Firefox23 + / IE9 +에서 F12를 누른 다음 "네트워크"또는 "넷"탭 패널을 연 다음 관심있는 HTTP 요청을 클릭하여 HTTP 요청 및 응답에 대한 모든 세부 정보를 확인할 수 있습니다. 아래 스크린 샷은 크롬에서이다 :
파일 다운로드시 해당 헤더를 설정하고 싶습니다.
우선,이 질문과 답변은 "파일 다운로드"(PDF, zip, Excel 등)가 아니라 "웹 페이지"(HTML 페이지)를 대상으로합니다. URI 경로 또는 쿼리 문자열 어딘가에 캐시 된 파일 형식 식별자를 사용하여 변경된 파일을 강제로 다시 다운로드하는 것이 좋습니다. 어쨌든 파일 다운로드에 캐시 없음 헤더를 적용하는 경우 HTTP 대신 HTTPS를 통해 파일 다운로드를 제공 할 때 IE7 / 8 버그에주의하십시오. 자세한 내용은 IE가 foo.jsf를 다운로드 할 수 없음을 참조하십시오 . IE는이 인터넷 사이트를 열 수 없습니다. 요청한 사이트를 사용할 수 없거나 찾을 수 없습니다 .