我们的调查向我们表明,并非所有浏览器都以统一的方式尊重http缓存指令.
出于安全原因,我们不希望在我们的应用程序某些网页缓存,有史以来,通过Web浏览器.这必须至少适用于以下浏览器:
Internet Explorer 6+
Firefox 1.5+
Safari 3+
Opera 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客户端(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-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 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
列出的值.
要验证这一个和另一个,您可以在webbrowser的开发人员工具集的HTTP流量监视器中查看/调试它们.您可以通过在Chrome/Firefox23 +/IE9 +中按F12,然后打开"网络"或"网络"选项卡面板,然后单击感兴趣的HTTP请求来发现有关HTTP请求和响应的所有详细信息.在下面的截图是从Chrome中:
我也想在文件下载上设置这些标题首先,这个问题和答案针对的是"网页"(HTML页面),而不是"文件下载"(PDF,zip,Excel等).您最好将它们缓存并在URI路径或查询字符串中的某处使用某些文件版本标识符以强制在已更改的文件上重新下载.无论如何在文件下载时应用这些无缓存标头时,请注意通过HTTPS而不是HTTP提供文件下载时的IE7/8错误.有关详细信息,请参阅IE无法下载foo.jsf.IE无法打开这个网站.请求的网站不可用或无法找到.
(嘿,大家:请不要盲目地复制并粘贴你能找到的所有标题)
首先,后退按钮历史记录不是缓存:
新鲜度模型(第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
已经暗示这更强).
Expires
HTTP/1.0客户端的过去日期(尽管这些天真正的 HTTP/1.0仅客户端完全不存在).
奖励:新的HTTP缓存RFC.
正如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
我发现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();
});
我发现此页面上的所有答案仍然存在问题.特别是,我注意到当你通过点击后退按钮访问它时,它们都不会阻止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的答案.
经过一番研究后,我们提出了以下似乎涵盖大多数浏览器的标题列表:
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
在响应中使用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);
在此处查看更完整的文档.
对于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();
这些指令不会降低任何安全风险.它们实际上是为了迫使UA刷新易变信息,而不是让UA不保留信息.看到这个类似的问题.至少,不能保证任何路由器,代理等也不会忽略缓存指令.
从更积极的角度来看,关于物理访问计算机,软件安装等的政策将使您在安全性方面领先于大多数公司.如果这些信息的消费者是公众的成员,那么你唯一能做的就是帮助他们理解,一旦信息到达他们的机器,那台机器就是他们的责任,而不是你的.
IE6中有一个错误
即使您使用"Cache-Control:no-cache",也始终缓存带有"Content-Encoding:gzip"的内容.
http://support.microsoft.com/kb/321722
您可以为IE6用户禁用gzip压缩(检查用户代理是否为"MSIE 6")
将修改后的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
HTTP 1.1的RFC 说正确的方法是为以下内容添加HTTP标头:
缓存控制:无缓存
如果较旧的浏览器不正确地符合HTTP 1.1,则可能会忽略它.对于那些你可以尝试标题:
Pragma:没有缓存
这也适用于HTTP 1.1浏览器.
头函数的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-IE8 over SSL和缓存的下载问题:无缓存标头(和类似的值)与MS Office文件,您可以使用缓存:私有,无存储标头和POST请求返回文件.有用.
在我的情况下,我解决了铬的问题