当前位置:  开发笔记 > 编程语言 > 正文

如何在所有浏览器中控制网页缓存?

如何解决《如何在所有浏览器中控制网页缓存?》经验,为你挑选了16个好方法。

我们的调查向我们表明,并非所有浏览器都以统一的方式尊重http缓存指令.

出于安全原因,我们不希望在我们的应用程序某些网页缓存,有史以来,通过Web浏览器.这必须至少适用于以下浏览器:

Internet Explorer 6+

Firefox 1.5+

Safari 3+

Opera 9+

我们的要求来自安全测试.从我们的网站注销后,您可以按后退按钮查看缓存页面.



1> BalusC..:
介绍

适用于所有提到的客户端(和代理)的正确最小标头集:

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客户端(1997年引入了HTTP 1.1),那么您可以省略Pragma.

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

如果您不关心HTTP 1.0代理,那么您可以省略Expires.

Cache-Control: no-store, must-revalidate

另一方面,如果服务器自动包含有效的Date标题,那么理论上你也可以省略Cache-ControlExpires仅依赖.

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

使用Python/Django:

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

使用Python/Pyramid:

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.

使用Apache .htaccess文件:


    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0

使用HTML4:




HTML元标记与HTTP响应标头

需要注意的是,当通过HTTP连接提供HTML页面,并且HTTP响应头和HTML 标记中存在标头时,HTTP响应标头中指定的标头将优先于HTML元标记.仅当通过file://URL 从本地磁盘文件系统查看页面时,才会使用HTML元标记.另请参阅W3 HTML规范第5.2.2节.如果不以编程方式指定它们,请注意这一点,因为Web服务器可以包含一些默认值.

通常,您最好不要指定HTML元标记以避免启动者混淆,并依赖于硬HTTP响应标头.而且,特别是这些标签在HTML5 中无效.仅允许HTML5规范中http-equiv列出的值.

验证实际的HTTP响应标头

要验证这一个和另一个,您可以在webbrowser的开发人员工具集的HTTP流量监视器中查看/调试它们.您可以通过在Chrome/Firefox23 +/IE9 +中按F12,然后打开"网络"或"网络"选项卡面板,然后单击感兴趣的HTTP请求来发现有关HTTP请求和响应的所有详细信息.在下面的截图是从Chrome中:

Chrome开发人员工具集HTTP流量监视器,显示stackoverflow.com上的HTTP响应标头

我也想在文件下载上设置这些标题

首先,这个问题和答案针对的是"网页"(HTML页面),而不是"文件下载"(PDF,zip,Excel等).您最好将它们缓存并在URI路径或查询字符串中的某处使用某些文件版本标识符以强制在已更改的文件上重新下载.无论如何在文件下载时应用这些无缓存标头时,请注意通过HTTPS而不是HTTP提供文件下载时的IE7/8错误.有关详细信息,请参阅IE无法下载foo.jsf.IE无法打开这个网站.请求的网站不可用或无法找到.


我想补充一点,这基本上就是美国银行所做的事情.如果你查看他们的响应头并将其转换为aspx,他们正在做:Response.AppendHeader("Cache-Control","no-cache,no-store,must-revalidate"); Response.AppendHeader("Expires","Thu,1994年12月1日16:00:00 GMT"); 我想,如果它对他们来说足够好,那对我来说就足够了.
这似乎并不完整.我在IE 8上尝试了这个解决方案,发现当你点击后退按钮时,浏览器会加载一个缓存版本.
可能你的测试方法是错误的.也许页面已经在缓存中?也许标题不正确/重写?也许你在看错了请求?等等..
实际上,我确认这种方法不完整并导致IE8问题,或者至少在某些情况下.具体来说,当使用IE8通过SSL获取资源时,IE8将拒绝第二次获取资源(根本不会获取资源,或者在第一次尝试之后,取决于使用的标头).参见[EricLaw的博客](http://blogs.msdn.com/b/ieinternals/archive/2009/10/02/internet-explorer-cannot-download-over-https-when-no-cache.aspx),实例.
@John:那个expires头文件正好是[HTTP 1.0规范]中的示例值(http://www.ietf.org/rfc/rfc1945.txt).它有效,但是完全采用那个时间戳有点荒谬.

2> Kornel..:

(嘿,大家:请不要盲目地复制并粘贴你能找到的所有标题)

首先,后退按钮历史记录不是缓存:

新鲜度模型(第4.2节)不一定适用于历史机制.也就是说,历史机制即使已经过期也可以显示先前的表示.

在旧的HTTP规范中,措辞甚至更强,明确告诉浏览器忽略后退按钮历史记录的缓存指令.

回到应该回到过去(到时候用户登录).它不会向前导航到先前打开的URL.

但是,实际上,在非常特定的情况下,缓存可以影响后退按钮:

页面必须通过HTTPS提供,否则此缓存破坏将不可靠.另外,如果您不使用HTTPS,那么您的页面很容易受到许多其他方式的登录窃取.

你必须发送Cache-Control: no-store, must-revalidate(一些浏览器观察no-store和一些观察must-revalidate)

永远不需要任何:

使用缓存标头 - 它根本不起作用.完全没用.

post-check/ pre-check- 它是仅适用于可缓存资源的IE-only指令.

两次或十几个部分发送相同的标题.一些PHP片段实际上取代了以前的标题,导致只发送了最后一个.

如果需要,可以添加:

no-cache或者max-age=0,这将使资源(URL)"陈旧",并要求浏览器检查服务器是否有更新的版本(no-store已经暗示这更强).

ExpiresHTTP/1.0客户端的过去日期(尽管这些天真正的 HTTP/1.0仅客户端完全不存在).


奖励:新的HTTP缓存RFC.


@Pacerier对于缓存,"no-cache"与"must-revalidate"的关系是正确的,但是回溯历史不是缓存.[浏览器特殊情况显式`必须重新验证`以控制历史行为](https://bugzilla.mozilla.org/show_bug.cgi?id=567365).

3> Pacerier..:

正如porneL所述,您想要的不是停用缓存,而是停用历史缓冲区.不同的浏览器有自己的微妙方法来禁用历史缓冲区.

在Chrome(v28.0.1500.95 m)中,我们只能这样做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
    在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)

请注意,需要https,因为Opera不会为普通的http页面停用历史记录缓冲区.如果你真的无法获得https并且你准备忽略Opera,你可以做的最好的是:

Cache-Control: no-store

下面显示了我的测试的原始日志:

HTTP:

    Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *

    失败: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: *

    失败: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: *

    失败: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: *

    失败: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: *

    失败: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: *

    失败: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

    失败: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: *

    失败: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: *

    失败: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: *

    失败: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

    失败: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

    失败: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

    失败: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: *

    失败: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: *

    失败: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: *

    失败: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: *

    失败: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

    失败: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

    失败: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


@Jordan,根据上面的日志,如果你有HTTPS然后添加`Cache-Control:no-store`就可以了.只有没有HTTPS时才需要``.
我知道这是几年前发布的,但这是一个有趣的阅读.这个问题一直让我疯狂了几个月,身体似乎真的知道如何处理缓存控制.我见过一些人使用``但似乎更像是解决实际问题的方法.我已经尝试过使用.htaccess并以这种方式修改标题,如果我使用HTTPS应该以这种方式工作吗?这主要是狩猎问题最多的问题.

4> Joseph Conno..:

我发现web.config路由很有用(尝试将其添加到答案中但似乎没有被接受,因此在此处发布)



    
        
            
            
            
            
            
            
        
    

这是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();
});



5> Chris Vassel..:

我发现此页面上的所有答案仍然存在问题.特别是,我注意到当你通过点击后退按钮访问它时,它们都不会阻止IE8使用页面的缓存版本.

经过大量的研究和测试,我发现我真正需要的只有两个标题是:

缓存控制:无存储
变化:*

有关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时,这些标题会导致从服务器请求页面直接在地址栏中.截至2010年1月,这涵盖了大约99%的正在使用的浏览器.

在IE6和Opera 9-10上,按下后退按钮仍然会导致加载缓存版本.在我测试的所有其他浏览器上,他们确实从服务器获取了一个新版本.到目前为止,我还没有找到任何一组标题,当您点击后退按钮时,这些标题会导致这些浏览器不返回页面的缓存版本.

更新: 写完这个答案后,我意识到我们的Web服务器将自己标识为HTTP 1.0服务器.我列出的标题是正确的,以便HTTP 1.0服务器的响应不被浏览器缓存.对于HTTP 1.1服务器,请查看BalusC的答案.


**这适用于IE8的后退按钮!!**在尝试其他所有建议中的所有内容后,添加"Vary:*"标题显然是唯一可以强制IE8在用户按下后退按钮时重新加载页面的内容.这个**确实可用于HTTP/1.1服务器.

6> Edward Wilde..:

经过一番研究后,我们提出了以下似乎涵盖大多数浏览器的标题列表:

Expires:Mon,26 Jul 1997 05:00:00 GMT

缓存控制:无缓存,私有,必须重新验证,max-stale = 0,post-check = 0,pre-check = 0 no-store

Pragma:没有缓存

在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


@bart:更麻烦的是,1997年7月26日是星期六,而不是星期一......
`Cache-Control:no-cache`和`Cache-Control:private`冲突 - 你永远不应该把它们放在一起:前者告诉浏览器和代理根本不要缓存,后者告诉代理不要缓存但是让浏览器保持他们的自己的私人副本.我不确定浏览器会遵循哪种设置,但浏览器和版本之间不太可能保持一致.
@Edward,经过测试,无法在Safari 5.1.7和Opera上运行

7> Dave Cheney..:

在响应中使用pragma标头是一个妻子的故事.RFC2616仅将其定义为请求标头

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


这是一个很好的例子,说明为什么你需要超越规范.如果规格总是很清晰,那么像StackOverflow这样的网站就没那么重要了.从[Microsoft](http://support.microsoft.com/kb/234067)_为了向后兼容HTTP 1.0服务器,Internet Explorer支持HTTP Pragma:no-cache标头的特殊用法.如果客户端通过安全连接(https://)与服务器通信,并且服务器返回带有响应的Pragma:no-cache标头,则Internet Explorer不会缓存响应._

8> Steven Oxley..:

免责声明:我强烈建议阅读@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);

在此处查看更完整的文档.


这充满了神话.预检查和后检查仅限IE,仅与缓存的响应相关,0值为无操作.max-stale是代理请求头,而不是服务器响应头.Expires只接受单个值.多个将导致忽略此标头.

9> kspearrin..:

对于ASP.NET Core,创建一个简单的中间件类:

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();

确保你之后添加它

app.UseStaticFiles();



10> Dustman..:

这些指令不会降低任何安全风险.它们实际上是为了迫使UA刷新易变信息,而不是让UA不保留信息.看到这个类似的问题.至少,不能保证任何路由器,代理等也不会忽略缓存指令.

从更积极的角度来看,关于物理访问计算机,软件安装等的政策将使您在安全性方面领先于大多数公司.如果这些信息的消费者是公众的成员,那么你唯一能做的就是帮助他们理解,一旦信息到达他们的机器,那台机器就是他们的责任,而不是你的.



11> Edson Medina..:

IE6中有一个错误

即使您使用"Cache-Control:no-cache",也始终缓存带有"Content-Encoding:gzip"的内容.

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

您可以为IE6用户禁用gzip压缩(检查用户代理是否为"MSIE 6")



12> Anders Sandv..:

将修改后的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



13> Chris Dail..:

HTTP 1.1的RFC 说正确的方法是为以下内容添加HTTP标头:

缓存控制:无缓存

如果较旧的浏览器不正确地符合HTTP 1.1,则可能会忽略它.对于那些你可以尝试标题:

Pragma:没有缓存

这也适用于HTTP 1.1浏览器.



14> Grey Panther..:

头函数的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);


这显然是错误的.对Expires,Cache-control和Pragma的第二次调用header()完全覆盖以前设置的值.

15> 小智..:

如果您遇到IE6-IE8 over SSL和缓存的下载问题:无缓存标头(和类似的值)与MS Office文件,您可以使用缓存:私有,无存储标头和POST请求返回文件.有用.



16> 小智..:

在我的情况下,我解决了铬的问题

当用户出于安全原因单击按钮时,我需要清除previus表单数据的内容

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有