태그 보관물: http-headers

http-headers

모든 브라우저에서 웹 페이지 캐싱을 어떻게 제어합니까? 모든 브라우저가 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 요청 및 응답에 대한 모든 세부 정보를 확인할 수 있습니다. 아래 스크린 샷은 크롬에서이다 :

파일 다운로드시 해당 헤더를 설정하고 싶습니다.

우선,이 질문과 답변은 “파일 다운로드”(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