[http] 모든 브라우저에서 웹 페이지 캐싱을 어떻게 제어합니까?

조사에 따르면 모든 브라우저가 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 요청 및 응답에 대한 모든 세부 정보를 확인할 수 있습니다. 아래 스크린 샷은 크롬에서이다 :

stackoverflow.com에 HTTP 응답 헤더를 표시하는 Chrome 개발자 툴셋 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이미 더 강력 함을 의미 함).
  • ExpiresHTTP / 1.0 클라이언트의 날짜가 과거와 같음 ( 요즘에는 실제 HTTP / 1.0 전용 클라이언트가 완전히 존재 하지는 않지만 ).

보너스 : 새로운 HTTP 캐싱 RFC .


답변

@Kornel이 언급했듯이 원하는 것은 캐시를 비활성화하는 것이 아니라 기록 버퍼를 비활성화하는 것입니다. 다른 브라우저에는 히스토리 버퍼를 비활성화하는 미묘한 방법이 있습니다.

Chrome (v28.0.1500.95m)에서는으로 만이 작업을 수행 할 수 있습니다 Cache-Control: no-store.

FireFox (v23.0.1)에서는 다음 중 하나가 작동합니다.

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (https 전용)

  3. Pragma: no-cache (https 전용)

  4. Vary: * (https 전용)

Opera (v12.15)에서는 Cache-Control: must-revalidate(https) 만 가능합니다.

Safari (v5.1.7, 7534.57.2)에서는 다음 중 하나가 작동합니다.

  1. Cache-Control: no-store

    <body onunload=""> html로

  2. Cache-Control: no-store (https 전용)

IE8 (v8.0.6001.18702IC)에서는 다음 중 하나가 작동합니다.

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate

    Expires: 0

  5. Cache-Control: must-revalidate

    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache (https 전용)

  7. 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 :

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. Cache-Control: no-store

    실패 : Safari 5.1.7, Opera 12.15

    성공 : Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store

    <body onunload="">

    실패 : Opera 12.15

    성공 : Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache

    실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15

    성공 : IE8

  12. Vary: *

    실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15

    성공 : 없음

  13. Pragma: no-cache

    실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15

    성공 : 없음

  14. 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

  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, FireFox 23, Safari 5.1.7, Opera 12.15

    성공 : IE8

  16. Cache-Control: must-revalidate, max-age=0

    실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15

    성공 : IE8

  17. Cache-Control: must-revalidate

    Expires: 0

    실패 : Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15

    성공 : IE8

  18. 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

  19. 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 :

  1. 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

    성공 : 없음

  2. 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

    성공 : 없음

  3. Vary: *

    실패 : Chrome 28, Safari 5.1.7, Opera 12.15

    성공 : FireFox 23, IE8

  4. Pragma: no-cache

    실패 : Chrome 28, Safari 5.1.7, Opera 12.15

    성공 : FireFox 23, IE8

  5. Cache-Control: no-cache

    실패 : Chrome 28, Safari 5.1.7, Opera 12.15

    성공 : FireFox 23, IE8

  6. 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

  7. 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

  8. 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

  9. Cache-Control: must-revalidate

    실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7

    성공 : Opera 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0

    <body onunload="">

    실패 : Chrome 28, FireFox 23, IE8, Safari 5.1.7

    성공 : Opera 12.15

  11. Cache-Control: must-revalidate, max-age=0

    실패 : Chrome 28, FireFox 23, Safari 5.1.7

    성공 : IE8, Opera 12.15

  12. 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

  13. 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

  14. Cache-Control: no-store

    실패 : Opera 12.15

    성공 : Chrome 28, FireFox 23, IE8, Safari 5.1.7

  15. 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

  16. 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

  17. 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

  18. Cache-Control: must-revalidate

    Expires: 0

    실패 : Chrome 28, FireFox 23, Safari 5.1.7,

    성공 : IE8, Opera 12.15

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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를 참조하십시오 .


답변

약간의 연구 끝에 우리는 대부분의 브라우저를 다루는 것으로 보이는 다음 헤더 목록을 만들었습니다.

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

http://forums.asp.net/t/1013531.aspx 에서 발견


답변

응답에 pragma 헤더를 사용하는 것은 아내 이야기입니다. RFC2616은 요청 헤더로만 정의합니다.

http://www.mnot.net/cache_docs/#PRAGMA