조사에 따르면 모든 브라우저가 HTTP 캐시 지시문을 동일한 방식으로 존중하는 것은 아닙니다.
보안상의 이유로 우리는 우리의 응용 프로그램에서 특정 페이지를 캐시하지 않으려는 , 지금까지 웹 브라우저. 최소한 다음 브라우저에서 작동해야합니다.
- Internet Explorer 6 이상
- Firefox 1.5 이상
- 사파리 3+
- 오페라 9+
- 크롬
우리의 요구 사항은 보안 테스트에서 비롯되었습니다. 웹 사이트에서 로그 아웃 한 후 뒤로 버튼을 누르고 캐시 된 페이지를 볼 수 있습니다.
답변
소개
언급 된 모든 클라이언트 (및 프록시)에서 작동하는 올바른 최소 헤더 세트 :
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는이 인터넷 사이트를 열 수 없습니다. 요청한 사이트를 사용할 수 없거나 찾을 수 없습니다 .
답변
(이봐 요, 여러분 : 찾을 수있는 모든 헤더를 마음대로 복사하여 붙여 넣지 마십시오)
우선, 뒤로 버튼 기록은 캐시 가 아닙니다 .
신선도 모델 (4.2 절)이 히스토리 메커니즘에 반드시 적용되는 것은 아닙니다. 즉, 히스토리 메커니즘은 만료 된 경우에도 이전 표시를 표시 할 수 있습니다.
이전 HTTP 사양에서는 단어가 더욱 강력 해져서 브라우저가 뒤로 버튼 기록에 대한 캐시 지시문을 무시하도록 명시 적으로 지시했습니다.
뒤로는 사용자 가 로그인 한 시간으로 되돌아갑니다 . 이전에 열린 URL로 이동하지 않습니다.
그러나 실제로 캐시는 매우 특정한 상황에서 뒤로 단추에 영향을 줄 수 있습니다.
- 페이지 는 HTTPS를 통해 전달 되어야합니다 . 그렇지 않으면이 캐시 버스 팅을 신뢰할 수 없습니다. 또한 HTTPS를 사용하지 않는 경우 페이지는 여러 가지 방법으로 로그인 도용에 취약합니다.
- 보내야합니다
Cache-Control: no-store, must-revalidate
(일부 브라우저는 관찰no-store
하고 일부는 관찰must-revalidate
)
다음 중 어느 것도 필요하지 않습니다 .
<meta>
캐시 헤더를 사용하면 전혀 작동하지 않습니다. 전혀 쓸모가 없습니다.post-check
/pre-check
— 캐치 가능한 리소스 에만 적용되는 IE 전용 지침입니다 .- 동일한 헤더를 두 번 또는 12 개로 보냅니다. 일부 PHP 스 니펫은 실제로 이전 헤더를 대체하므로 마지막 헤더 만 전송됩니다.
원하는 경우 다음을 추가 할 수 있습니다.
no-cache
또는max-age=0
을 사용하면 리소스 (URL)를 “stale”로 만들고 최신 버전이있는 경우 브라우저에서 서버를 확인해야합니다 (no-store
이미 더 강력 함을 의미 함).Expires
HTTP / 1.0 클라이언트의 날짜가 과거와 같음 ( 요즘에는 실제 HTTP / 1.0 전용 클라이언트가 완전히 존재 하지는 않지만 ).
보너스 : 새로운 HTTP 캐싱 RFC .
답변
@Kornel이 언급했듯이 원하는 것은 캐시를 비활성화하는 것이 아니라 기록 버퍼를 비활성화하는 것입니다. 다른 브라우저에는 히스토리 버퍼를 비활성화하는 미묘한 방법이 있습니다.
Chrome (v28.0.1500.95m)에서는으로 만이 작업을 수행 할 수 있습니다 Cache-Control: no-store
.
FireFox (v23.0.1)에서는 다음 중 하나가 작동합니다.
-
Cache-Control: no-store
-
Cache-Control: no-cache
(https 전용) -
Pragma: no-cache
(https 전용) -
Vary: *
(https 전용)
Opera (v12.15)에서는 Cache-Control: must-revalidate
(https) 만 가능합니다.
Safari (v5.1.7, 7534.57.2)에서는 다음 중 하나가 작동합니다.
-
Cache-Control: no-store
<body onunload="">
html로 -
Cache-Control: no-store
(https 전용)
IE8 (v8.0.6001.18702IC)에서는 다음 중 하나가 작동합니다.
-
Cache-Control: must-revalidate, max-age=0
-
Cache-Control: no-cache
-
Cache-Control: no-store
-
Cache-Control: must-revalidate
Expires: 0
-
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
-
Pragma: no-cache
(https 전용) -
Vary: *
(https 전용)
위의 내용을 결합하면 Chrome 28, FireFox 23, IE8, Safari 5.1.7 및 Opera 12.15에서 작동하는이 솔루션을 제공합니다. Cache-Control: no-store, must-revalidate
(https only)
Opera는 일반 http 페이지에 대한 히스토리 버퍼를 비활성화하지 않으므로 https가 필요합니다. 실제로 https를 얻을 수없고 Opera를 무시할 준비가 되었다면 최선의 방법은 다음과 같습니다.
Cache-Control: no-store
<body onunload="">
아래는 내 테스트의 원시 로그를 보여줍니다.
HTTP :
-
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Opera 12.15
성공 : Chrome 28, FireFox 23, IE8, Safari 5.1.7 -
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Opera 12.15
성공 : Chrome 28, FireFox 23, IE8, Safari 5.1.7 -
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
실패 : Safari 5.1.7, Opera 12.15
성공 : Chrome 28, FireFox 23, IE8 -
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
실패 : Safari 5.1.7, Opera 12.15
성공 : Chrome 28, FireFox 23, IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Cache-Control: no-store
실패 : Safari 5.1.7, Opera 12.15
성공 : Chrome 28, FireFox 23, IE8 -
Cache-Control: no-store
<body onunload="">
실패 : Opera 12.15
성공 : Chrome 28, FireFox 23, IE8, Safari 5.1.7 -
Cache-Control: no-cache
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Vary: *
실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
성공 : 없음 -
Pragma: no-cache
실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
성공 : 없음 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Cache-Control: must-revalidate, max-age=0
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Cache-Control: must-revalidate
Expires: 0
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
성공 : IE8 -
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
성공 : 없음
HTTPS :
-
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
성공 : 없음 -
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
성공 : 없음 -
Vary: *
실패 : Chrome 28, Safari 5.1.7, Opera 12.15
성공 : FireFox 23, IE8 -
Pragma: no-cache
실패 : Chrome 28, Safari 5.1.7, Opera 12.15
성공 : FireFox 23, IE8 -
Cache-Control: no-cache
실패 : Chrome 28, Safari 5.1.7, Opera 12.15
성공 : FireFox 23, IE8 -
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
실패 : Chrome 28, Safari 5.1.7, Opera 12.15
성공 : FireFox 23, IE8 -
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
실패 : Chrome 28, Safari 5.1.7, Opera 12.15
성공 : FireFox 23, IE8 -
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
실패 : Chrome 28, Safari 5.1.7, Opera 12.15
성공 : FireFox 23, IE8 -
Cache-Control: must-revalidate
실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7
성공 : Opera 12.15 -
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
<body onunload="">
실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7
성공 : Opera 12.15 -
Cache-Control: must-revalidate, max-age=0
실패 : Chrome 28, FireFox 23, Safari 5.1.7
성공 : IE8, Opera 12.15 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Chrome 28, Safari 5.1.7
성공 : FireFox 23, IE8, Opera 12.15 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Chrome 28, Safari 5.1.7
성공 : FireFox 23, IE8, Opera 12.15 -
Cache-Control: no-store
실패 : Opera 12.15
성공 : Chrome 28, FireFox 23, IE8, Safari 5.1.7 -
Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Opera 12.15
성공 : Chrome 28, FireFox 23, IE8, Safari 5.1.7 -
Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
실패 : Opera 12.15
성공 : Chrome 28, FireFox 23, IE8, Safari 5.1.7 -
Cache-Control: private, no-cache
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
실패 : Chrome 28, Safari 5.1.7, Opera 12.15
성공 : FireFox 23, IE8 -
Cache-Control: must-revalidate
Expires: 0
실패 : Chrome 28, FireFox 23, Safari 5.1.7,
성공 : IE8, Opera 12.15 -
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
실패 : Chrome 28, FireFox 23, Safari 5.1.7,
성공 : IE8, Opera 12.15 -
Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
실패 : Chrome 28, FireFox 23, Safari 5.1.7,
성공 : IE8, Opera 12.15 -
Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
실패 : Chrome 28, FireFox 23, Safari 5.1.7,
성공 : IE8, Opera 12.15 -
Cache-Control: private, must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
실패 : Chrome 28, Safari 5.1.7
성공 : FireFox 23, IE8, Opera 12.15 -
Cache-Control: no-store, must-revalidate
실패 :
성공 하지 못함 : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
답변
web.config 경로가 유용하다는 것을 알았습니다 (답을 추가하려고했지만 여기에 게시되지 않은 것 같습니다)
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
<!-- HTTP 1.1. -->
<add name="Pragma" value="no-cache" />
<!-- HTTP 1.0. -->
<add name="Expires" value="0" />
<!-- Proxies. -->
</customHeaders>
</httpProtocol>
</system.webServer>
그리고 동일한 작업을 수행하는 express / node.js 방법이 있습니다.
app.use(function(req, res, next) {
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
res.setHeader('Pragma', 'no-cache');
res.setHeader('Expires', '0');
next();
});
답변
이 페이지의 모든 답변에 여전히 문제가 있음을 발견했습니다. 특히, 나는 뒤로 버튼을 눌렀을 때 IE8이 캐시 된 버전의 페이지를 사용하는 것을 멈추지 않을 것입니다.
많은 연구와 테스트 끝에 필자가 실제로 필요한 유일한 헤더는 다음과 같습니다.
캐시 제어 : 저장소 없음
Vary : *
Vary 헤더에 대한 설명은 http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6을 확인 하십시오.
IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 및 Opera 9-10에서 이러한 헤더로 인해 페이지 링크를 클릭하거나 URL을 넣을 때 서버에서 페이지를 요청했습니다 주소 표시 줄에 직접. 1 월 10 일 현재 사용중인 모든 브라우저의 약 99 %가 여기 에 해당합니다.
IE6 및 Opera 9-10에서 뒤로 버튼을 누르면 캐시 된 버전이 계속로드됩니다. 내가 테스트 한 다른 모든 브라우저에서 서버에서 새로운 버전을 가져 왔습니다. 지금까지 뒤로 버튼을 눌렀을 때 해당 브라우저가 캐시 된 버전의 페이지를 반환하지 않는 헤더 세트를 찾지 못했습니다.
업데이트 : 이 답변을 작성한 후 웹 서버가 자신을 HTTP 1.0 서버로 식별하고 있음을 깨달았습니다. 내가 나열한 헤더는 HTTP 1.0 서버의 응답이 브라우저에 의해 캐시되지 않도록하기위한 올바른 헤더입니다. HTTP 1.1 서버의 경우 BalusC ‘s answer를 참조하십시오 .
답변
약간의 연구 끝에 우리는 대부분의 브라우저를 다루는 것으로 보이는 다음 헤더 목록을 만들었습니다.
- 만료 : 1997 년 7 월 26 일 월요일 05:00:00 GMT
- 캐시 제어 : no-cache , private, must-revalidate , max-stale = 0, post-check = 0, pre-check = 0 no-store
- 프라 그마 : 캐시 없음
ASP.NET에서는 다음 스 니펫을 사용하여이를 추가했습니다.
Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0