문제

우리의 조사는 표시하지 않는 것이 우리에는 모든 브라우저를 존중하는 http 지시어는 캐쉬에서 균일한 방식이다.

보안상의 이유로 우리가 원하지 않는 특정 페이지에 우리의 응용 프로그램에서 캐시 이제까지, 웹 브라우저입니다.이 작업해야 합 최소한 브라우저는 다음과 같:

  • Internet Explorer6+
  • Firefox1.5+
  • 3+사파리
  • 오페라 9+
  • 크롬

우리의 요구 사항에서 온 보안 테스트입니다.로그인 한 후에서 우리의 웹 사이트할 수 있습 뒤로 가기 버튼을 누르고 볼 캐시된 페이지입니다.

도움이 되었습니까?

해결책

소개

정확한 최소한의 헤더에서 작동하는 모든 언급은 클라이언트(와 프록시):

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

Cache-Control 당 HTTP1.1spec 클라이언트와 프록시(및 암시적으로 필요에 의해 어떤 클라이언트는 다음을 Expires).이 Pragma 당 HTTP1.0spec 위해 선사 시대의 클라이언트입니다.이 Expires 당 HTTP1.0,1.1spec 클라이언트와 프록시입니다.HTTP1.1 Cache-Control 우선 Expires, 그래서 그것의 모든 후 HTTP1.0 에 대한 프록시니다.

는 경우 걱정하지 않 IE6 그 깨진 캐싱을 제공하는 경우 페이지 HTTPS 만 no-store, 할 수 있습을 생략 Cache-Control: no-cache.

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

는 경우 걱정하지 않 IE6 도 HTTP1.0 클라이언트(HTTP1.1 도입되었 1997),할 수 있는 다음을 생략 Pragma.

Cache-Control: no-store, must-revalidate
Expires: 0

는 경우에 대해 걱정하지 않는 HTTP1.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 를 사용하여블릿,또는 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:

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,또는 파이썬/플라스크:

headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.

를 사용하는 파이썬/Django:

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')
    )
)

를 사용하여 이동:

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 <meta http-equiv> 범주,다음 중 하나에 지정된 HTTP 응답 헤더를 얻을 것이 우선 HTML 메타 태그입니다.HTML 메타 태그만 사용될 때 페이지에서 보컬 디스크 파일 시스템을 통해 file:// URL.또한 참조 W3HTML spec 장 5.2.2.돌로 이를 지정하지 않으면 그들을 프로그래밍 방식으로,때문에 웹서버할 수 있는 즉 일부를 포함한 기본값으로 되돌릴 수 있습니다.

일반적으로,당신은 더 나은 단지 지정 HTML 메타 태그를 혼동을 피하기 위해해서 우선,고서에 의존하는 HTTP 응답 헤더로 보낸다.또한,특히 그 <meta http-equiv> 태그 잘못된 HTML5.만 http-equiv 에 나열된 값 HTML5 사양 이 허용됩니다.

을 확인하는 실제적인 HTTP 응답 헤더

을 확인하고,다른 당신이 볼 수 있/디버그에서 그들 HTTP 트래픽을 모니터의 웹 브라우저의 개발자 도구 세트.당신이 얻을 수 있습 F12 에서 크롬/Firefox23+/IE9+,다음을 열고"네트워크"또는"인터넷"탭을 패널 및 다음을 클릭하는 HTTP 요청의 관심을 밝히기 위해 모두에 대해 자세히 HTTP 요청과 응답입니다.이 아래 스크린샷 에서는 Chrome:

Chrome developer toolset HTTP traffic monitor showing HTTP response headers on stackoverflow.com

나는 설정하려는 사람들 헤더에 파일을 다운로드도

먼저,이 질문에 대답은 대상에서"웹 페이지"(HTML 페이지),아니다"파일을 다운로드"(PDF,zip,Excel,etc.).당신은 더 나은 그들이 캐시고 사용하게 어떤 파일 버전을 식별자 어딘가에 URI 경로 또는 쿼리 문자열을 강제로 다시 다운로드에서 파일이 변경되었.적용할 경우 그 no-cache 헤더에 파일을 다운로드는 어쨌든,다음의 조심하십시오 IE7/8 개의 버그 때 제일 다운로드 HTTPS 를 통해 대신 HTTP.에 대한 세부사항 참조하십시오 즉 다운로드할 수 없습니다 foo.jsf.IE 을 열 수 없이 인터넷 사이트.요청한 사이트를 사용할 수 없거나을 찾을 수 없.

다른 팁

(hey,everyone:지만 어리석게 복사&붙여 모든 헤더를 찾을 수 있습니다)

첫째, 버튼을 다시 기록 아 캐시:

신선도 모델(4.2)하지 않는 반드시 적용하는 역사 메커니즘이 있습니다.는,역사 메커니즘을 표시할 수 있습니다 이전 표현는 경우에도 그것은이 만료되었습니다.

오래된 HTTP spec 표현이었다도 더 강하고,명시적으로 말하는 브라우저를 무시하는 지시어는 캐쉬에 대한 후 버튼을 역사입니다.

다시는 돌아서는 시간(시간에 사용자 로그인).그렇지 않을 탐색으로 이전에 열립니다.

그러나 실제 캐시 영향을 미칠 수 있는 다시 버튼,매우 특정 상황:

  • 페이지 통해 전달되는 HTTPS,그렇지 않으면 이 캐시-파열시키지 않는 신뢰할 수 있습니다.Plus,를 사용하지 않는 경우 HTTPS,다음 페이지에 취약한 로그인을 훔치는 많은 다른 방법으로.
  • 을 보내야 합니다 Cache-Control: no-store, must-revalidate (일부 브라우저 관찰 no-store 일부 관찰 must-revalidate)

당신 이 필요하다:

  • <meta> 캐시글—그것은 작동하지 않는다.니다.
  • post-check/pre-check —그것은 즉 아 directive 에만 적용되는 cachable 리소스입니다.
  • 보내는 같은 헤더가 두 번이나 다스의 부분입니다.일부 PHP 조각 밖에는 실제로 바꾸기 이전글의 결과로,지난만 하나 되는 전송됩니다.

당신이 원하는 경우,추가할 수 있습니다:

  • no-cachemax-age=0, 는 리소(URL)"오래된"이 요구를 확인 하려면 브라우저를 가진 서버가 있다면 새로운 버전(no-store 이미에서 알 수 있듯이 더욱 강력한).
  • Expires 날짜 과거에 HTTP/1.0 클라이언트(지 실시 HTTP/1.0-만 클라이언트는 완전히 존재하지 않는 이러한 일)입니다.

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

로 porneL stated,당신이 무엇을 원하지 않는 비활성화를 캐쉬하지만,비활성화 역사를 버퍼입니다.다른 브라우저가 자신의 미묘한 방법으로 사용하지 않 역사 buffer.

크롬(v28.0.1500.95m)우리가 할 수 있는 이것에 의해서만 Cache-Control: no-store.

파이어폭스(v23.0.1)하나의 이러한 작동:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache https(만)

  3. Pragma: no-cache https(만)

  4. Vary: * https(만)

오페라에서(v12.15)우리는 할 수 있는 이해 Cache-Control: must-revalidate https(만).

에서 사파리(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(만)

결합은 우리에게 이 솔루션을 작동하는 크롬 28,FireFox23,IE8,사파리 5.1.7,그리고 오페라 12.15: Cache-Control: no-store, must-revalidate https(만)

Https 이 필요하기 때문에 오페라지 않을 비활성화 역사를 버퍼에 대한 일반 http 페이지입니다.당신이 정말로 얻을 수 없습니다 https 및 준비가 되어 있을 무시하는 오페라,당신이 할 수 있는 최고의 this:

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="">
    실패:오페라 12.15
    성:크롬 28,FireFox23,IE8,사파리 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="">
    실패:오페라 12.15
    성:크롬 28,FireFox23,IE8,사파리 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: *
    실패:Safari5.1.7,오페라 12.15
    성:크롬 28,FireFox23,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: *
    실패:Safari5.1.7,오페라 12.15
    성:크롬 28,FireFox23,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="">
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 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="">
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 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="">
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 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="">
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 12.15
    성:IE8

  9. Cache-Control: no-store
    실패:Safari5.1.7,오페라 12.15
    성:크롬 28,FireFox23,IE8

  10. Cache-Control: no-store
    <body onunload="">
    실패:오페라 12.15
    성:크롬 28,FireFox23,IE8,사파리 5.1.7

  11. Cache-Control: no-cache
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 12.15
    성:IE8

  12. Vary: *
    실패:크롬 28,FireFox23,IE8,사파리 5.1.7,오페라 12.15
    성:없음

  13. Pragma: no-cache
    실패:크롬 28,FireFox23,IE8,사파리 5.1.7,오페라 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="">
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 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="">
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 12.15
    성:IE8

  16. Cache-Control: must-revalidate, max-age=0
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 12.15
    성:IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 12.15
    성:IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    실패:크롬 28,FireFox23,사파리 5.1.7,오페라 12.15
    성:IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    실패:크롬 28,FireFox23,IE8,사파리 5.1.7,오페라 12.15
    성:없음

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    실패:크롬 28,FireFox23,IE8,사파리 5.1.7,오페라 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="">
    실패:크롬 28,FireFox23,IE8,사파리 5.1.7,오페라 12.15
    성:없음

  3. Vary: *
    실패:크롬 28,사파리 5.1.7,오페라 12.15
    성:FireFox23,IE8

  4. Pragma: no-cache
    실패:크롬 28,사파리 5.1.7,오페라 12.15
    성:FireFox23,IE8

  5. Cache-Control: no-cache
    실패:크롬 28,사파리 5.1.7,오페라 12.15
    성:FireFox23,IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    실패:크롬 28,사파리 5.1.7,오페라 12.15
    성:FireFox23,IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    실패:크롬 28,사파리 5.1.7,오페라 12.15
    성:FireFox23,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: *
    실패:크롬 28,사파리 5.1.7,오페라 12.15
    성:FireFox23,IE8

  9. Cache-Control: must-revalidate
    실패:크롬 28,FireFox23,IE8,사파리 5.1.7
    성:오페라 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    실패:크롬 28,FireFox23,IE8,사파리 5.1.7
    성:오페라 12.15

  11. Cache-Control: must-revalidate, max-age=0
    실패:크롬 28,FireFox23,사파리 5.1.7
    성:IE8,오페라 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="">
    실패:크롬 28,사파리 5.1.7
    성:FireFox23,IE8,오페라 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="">
    실패:크롬 28,사파리 5.1.7
    성:FireFox23,IE8,오페라 12.15

  14. Cache-Control: no-store
    실패:오페라 12.15
    성:크롬 28,FireFox23,IE8,사파리 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="">
    실패:오페라 12.15
    성:크롬 28,FireFox23,IE8,사파리 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="">
    실패:오페라 12.15
    성:크롬 28,FireFox23,IE8,사파리 5.1.7

  17. Cache-Control: private, no-cache
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    실패:크롬 28,사파리 5.1.7,오페라 12.15
    성:FireFox23,IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    실패:크롬 28,FireFox23,사파리 5.1.7,
    성:IE8,오페라 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    실패:크롬 28,FireFox23,사파리 5.1.7,
    성:IE8,오페라 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    실패:크롬 28,FireFox23,사파리 5.1.7,
    성:IE8,오페라 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="">
    실패:크롬 28,FireFox23,사파리 5.1.7,
    성:IE8,오페라 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    실패:크롬 28,사파리 5.1.7
    성:FireFox23,IE8,오페라 12.15

  23. Cache-Control: no-store, must-revalidate
    실패:없음
    성:크롬 28,FireFox23,IE8,사파리 5.1.7,오페라 12.15

I found the 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>

그리고 여기에 익스프레스/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 에서 사용하여 캐쉬된 버전의 페이지에 액세스할 때 그것을 타격하여 뒤로 버튼을 클릭합니다.

후에 많이 연구하고 테스트하는 두 개의 헤더 내가 정말 필요했다:

Cache-Control:no-store
변:*

에 대한 설명 Vary 헤더,확인 http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

에 IE6-8,FF1.5-3.5,크롬 2-3,Safari4,그리고 오페라 9-10,이러한 헤더가 발생할 페이지를 요청하면 서버에서 당신은 링크를 클릭하여 페이지,또는 URL 주소창에서 직접됩니다.에 대해 다루고 99% 의 모든 브라우저에서 사용으로 Jan'10.

에 IE6,그리고 오페라 9-10,뒤로 버튼을 여전히 발생하면 캐쉬된 버전을 로드할 수 있습니다.에는 모든 다른 브라우저는 내가 테스트,그들은 가져오는 신선한 버전에서 서버입니다.지금까지,모든 설정한 헤더는 원인이 될 것이 해당 브라우저를 반환하지 않는 캐시된 버전의 페이지할 수 있습니다.

업데이트: 한 후 이것을 쓰고 대답을 깨달았다는 우리의 웹 서버는 자신을 식별하는 HTTP1.0server.헤더 나열은 올바른 것들기 위해서는 답 HTTP1.0 서버를 캐쉬에 저장하지 않는 브라우저에 의하여.HTTP1.1server,보 BalusC 의 응답.

후에 조금의 연구는 다음과 같은 헤더 목록 하는 듯한 대부분의 브라우저

에 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

면책 조항:나는 것을 강력하게 읽고@BalusC 의 대답이다.을 읽은 후에 다음과 같은 캐싱 튜토리얼: http://www.mnot.net/cache_docs/ (읽는 것이 좋습니 너무,그것),나는 그것이 정확해야 합니다.그러나,역사적인 이유로(고 있기 때문에 그것을 테스트하는 나 자신),제가 포함됩니다 내 답변을 아래:


나는'받아들여'응답 PHP 는 작동하지 않았습니다.그때 나는 작은 연구를 했을 발견,약간의 변형,그것을 테스트하고,성공했습니다.그것은 여기:

header('Cache-Control: no-store, private, no-cache, must-revalidate');     // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false);  // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');                  // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');

는 작업해야 합니다.문제는 설정할 때 동일한 부분의 헤더가 두 번는 경우 false 지 않은 전송으로 두 번째 인수하는 헤더 기능,헤더 기능이 단순히 덮어쓰기 이전 header() 전화입니다.그래서,설정할 때 Cache-Control, 예를 들어,는 경우에 한하고 싶지 않은 모든 인수나 header() 함수 호출,그 다음과 같은 것이 가능합니다.

header('Cache-Control: this');
header('Cache-Control: and, this', false);

더 완벽한 문서 .

의 버그가 있 IE6

콘텐츠로"Content-Encoding:gzip"항상도 캐시를 사용하는 경우"Cache-Control:no-cache".

http://support.microsoft.com/kb/321722

비활성화할 수 있습 gzip 으로 압축한 IE6 사용자는(을 확인 사용자 에이전트에 대한"MSIE6")

대 ASP.NET 코어를 만들고,간단한 미들웨어 클래스:

public class NoCacheMiddleware
{
    private readonly RequestDelegate m_next;

    public NoCacheMiddleware( RequestDelegate next )
    {
        m_next = next;
    }

    public async Task Invoke( HttpContext httpContext )
    {
        httpContext.Response.OnStarting( ( state ) =>
        {
            // ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
            httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
            httpContext.Response.Headers.Append( "Pragma", "no-cache" );
            httpContext.Response.Headers.Append( "Expires", "0" );
            return Task.FromResult( 0 );
        }, null );

        await m_next.Invoke( httpContext );
    }
}

그 등록 Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

을 추가 확인하이 어딘가에 후

app.UseStaticFiles();

RFC 한 HTTP1.1 말 적절한 방법을 추가하는 HTTP 헤더에 대한:

Cache-Control:no-cache

오래된 브라우저를 무시할 수 있습이지 않은 경우를 제대로 준수하는 HTTP1.1.사람들을 위해 시도할 수 있습니다 header:

Pragma:no-cache

이것은 또한 해야하는 작업에 대한 HTTP1.1 브라우저입니다.

이 지시어지 않을 완화하는 어떤 보안 위험이 있습니다.그들은 정말하기위한 힘 UA 의 새로 고침하는 휘발성 정보를 유지 UA 의에서 정보를 유지하.보 이와 유사한 질문.최소한 보장은 없는 어떤 라우터,프록시,등등.을 무시하지 않을 것이다 캐싱 지시어뿐만 아니라.

긍정적인 주에,정책에 대한 물리적 액세스 컴퓨터 소프트웨어를 설치하고,다음과 같이 당신을 넣어 km 앞서 대부분의 기업 측면에서의 보안을 보장합니다.한 경우 소비자의 이 정보에는 공중의 구성원,수있는 유일한 방법은 당신이 정말로 하는 것을 이해하도록 돕는 일단의 정보를 안타의 기계는 기계 책임 것이 아닙니다.

설정을 수정한 http 헤더를 어떤 날짜 1995 년에 일반적으로 않습니다.

예를 들어 다음과 같습니다.

Expires: Wed, 15 Nov 1995 04:58:08 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Cache-Control: no-cache, must-revalidate

PHP 에 대한 설명서를 헤더 기능 오히려 완벽한 예(기여해 세 번째 파티):

    header('Pragma: public');
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");                  // Date in the past   
    header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');     // HTTP/1.1
    header('Cache-Control: pre-check=0, post-check=0, max-age=0', false);    // HTTP/1.1
    header ("Pragma: no-cache");
    header("Expires: 0", false);

당신이 직면 다운로드하는 문제 IE6-IE8over SSL 및 캐시:no-cache header(및 이와 유사한 값)와 MS 오피스 파일을 사용할 수 있습 캐시:private,no-store 헤더와 반환하는 파일에 POST 요청을 합니다.그것은 작동합니다.

내 경우에 문제를 해결에는 크롬과이

<form id="form1" runat="server" autocomplete="off">

는 내가 필요한 컨텐츠를 지우의 previus 형태 데이터를 때 사용자가 버튼을 클릭하여 다시는 보안상의 이유로

나는 최고의 그리고 가장 일관된 결과를 통해 모든 브라우저로 설정 Pragma:no-cache

헤더를 응답이 제공 BalusC 을 방해하지 않 Safari5(그리고 아마도 이전 버전뿐만 아니라)에서는 콘텐츠를 표시하는 브라우저에서 캐시를 사용할 때 브라우저의 뒤로 버튼을 누릅니다.을 방지하는 방법이 추가 빈 onunload 이벤트 처리기 특성을 몸을 태그:

<body onunload=""> 

이 해킹을 분명히 끊어 다시 앞으로 캐쉬에서 사파리: 거기에 십자가 브라우저 onload 이벤트를 클릭할 때 뒤로 버튼?

허용되는 대답이 나타나지 않을 작업에 대한 IIS7+가 다수의 질문에 대한 캐시 헤더를 보내지 못에 II7:

용 정답에 헤더를 설정해야 합니다,하지만 그들이 어떻게 설정해야 합니다.이 방법은 작품과 함께 IIS7:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");

첫 번째 라인에 설정 Cache-control 하기 no-cache, 고,두 번째 라인에 추가합니다 다른 속성 no-store, must-revalidate

또한,단지에 대한 좋은 측정,확인을 다시 설정 ExpiresDefault.htaccess 파일을 사용하는 경우는여 캐싱을 사용합니다.

ExpiresDefault "access plus 0 seconds"

나중에 사용할 수 있습니다 ExpiresByType 특정 값을 설정해하려는 파일을 캐시:

ExpiresByType image/x-icon "access plus 3 month"

이 수 있습니다 또한 편리하는 경우 동적 파일 등php,etc.되고 있는 브라우저에 의해 캐과할 수 없습니다.체크 ExpiresDefault.

이외에 헤더를 고려한 제공을 통해 귀하의 페이지 https.많은 브라우저를 캐싱하지 않는 https 를 기본적으로 합니다.

//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>

완료 BalusC -> 응답 는 경우에 당신은 당신을 사용하여 perl 사용할 수 있는 CGI 를 추가하는 HTTP 헤더가 있습니다.

를 사용하여 Perl:

Use CGI;    
sub set_new_query() {
        binmode STDOUT, ":utf8";
        die if defined $query;
        $query = CGI->new();
        print $query->header(
                        -expires       => 'Sat, 26 Jul 1997 05:00:00 GMT',
                        -Pragma        => 'no-cache',
                        -Cache_Control => join(', ', qw(
                                            private
                                            no-cache
                                            no-store
                                            must-revalidate
                                            max-age=0
                                            pre-check=0
                                            post-check=0 
                                           ))
        );
    }

를 사용하여 아파치 httpd.conf

<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>

참고: 을 사용하여 html 메타,브라우저 그들을 무시하고,캐시된 페이지입니다.

내가 원하는 것을 지적하면 사람하고 싶어 캐시 방지만 동적인 내용을 추가,이들 헤더를 추가해야한 프로그래밍 방식으로 보여줍니다.

내가 편집한 구성 파일의 프로젝트에 추가하 no-cache 헤더를 의미하지만,이는 또한 장애인을 정적 컨텐츠를 캐싱하지 않는 일반적으로 바람직합니다.응답 헤더 수정 코드에서는 이미지와 스타일을 파일을 캐시됩니다.

이것은 아주 명백한,아직은 언급 할 가치가있다.

고 또 다른 주의해야 합니다.를 사용할 때는 주의해야 합 ClearHeaders 방법에서 HttpResponse 클래스입니다.을 제공할 수 있습니다 몇몇 타박상을 사용할 경우 무모.다음과 같이면 나쁘지 않다고 생각합니다.

후에는 리다이렉션에 ActionFilterAttribute 이벤트의 결과를 취소하는 모든 헤더를 모두 잃고 세션 데이터와 데이터 TempData 저장합니다.하는 것이 더 안전을 리디렉션에서 작업 또는지 명확한 헤더의 경우 리디렉션합니다.

제 생각에 나는 낙담을 사용하는 모든 ClearHeaders 방법입니다.그것의 더 나은 제거하는 헤더에 따로 있습니다.을 설정 Cache-Control 헤더를 제대로 나는 이것을 사용하는 코드:

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");

행운을 했으로 <head><meta> 요소입니다.추가 HTTP 캐시 관련 매개 변수를 직접(외부의 HTML doc)는 사실입니다.

에서 샘플 코드를 사용하기 web.py web.header 호출을 다음과 같습니다.저는 의도적으로 편집된 내 개인적인 관련이 없는 유틸리티 코드입니다.

    import web
    import sys
    import PERSONAL-UTILITIES

    myname = "main.py"

    urls = (
        '/', 'main_class'
    )

    main = web.application(urls, globals())

    render = web.template.render("templates/", base="layout", cache=False)

    class main_class(object):
        def GET(self):
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.main_form()

        def POST(self):
            msg = "POSTed:"
            form = web.input(function = None)
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.index_laid_out(greeting = msg + form.function)

    if __name__ == "__main__":
        nargs = len(sys.argv)
        # Ensure that there are enough arguments after python program name
        if nargs != 2:
            LOG-AND-DIE("%s: Command line error, nargs=%s, should be 2", myname, nargs)
        # Make sure that the TCP port number is numeric
        try:
            tcp_port = int(sys.argv[1])
        except Exception as e:
            LOG-AND-DIE ("%s: tcp_port = int(%s) failed (not an integer)", myname, sys.argv[1])
        # All is well!
        JUST-LOG("%s: Running on port %d", myname, tcp_port)
        web.httpserver.runsimple(main.wsgifunc(), ("localhost", tcp_port))
        main.run()

이 링크가 표시하는 경우 연구에서 캐시:

http://securityevaluators.com/knowledge/case_studies/caching/

요약에 따라,문서,만 Cache-Control: no-store 작품에서는 Chrome,Firefox,IE.IE 지 다른 컨트롤하지만,Chrome 및 Firefox 하지 않습니다.링크가 좋은 읽기 전체의 역사와 함께 캐시고 문서화하는 증거의 개념입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top