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

出于安全原因,我们不希望应用程序中的某些页面被web浏览器缓存。这必须至少适用于以下浏览器:

Internet Explorer 6+Firefox 1.5+Safari 3+歌剧9+铬

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


当前回答

我发现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();
});

其他回答

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

此外,如果您使用.htaccess文件启用缓存,请确保重置该文件中的ExpiresDefault。

ExpiresDefault "access plus 0 seconds"

然后,可以使用ExpiresByType为要缓存的文件设置特定值:

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

如果您的动态文件(如php等)被浏览器缓存,并且您无法找出原因,那么这可能也很有用。选中ExpiresDefault。

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

有效期:1997年7月26日星期六05:00:00 GMT缓存控制:无缓存,私有,必须重新验证,最大失效=0,后检查=0,预检查=0无存储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", "Sat, 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

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

在Chrome(v28.0.1500.95 m)中,我们只能通过缓存控制来做到这一点:无存储。

在FireFox(23.0.1版)中,以下任何一项都可以工作:

缓存控制:无存储缓存控制:无缓存(仅限https)Pragma:无缓存(仅限https)变量:*(仅限https)

在Opera(v12.15)中,我们只能通过缓存控制:必须重新验证(仅限https)。

在Safari(v5.1.7、7534.57.2)中,以下任何一项都可以:

缓存控制:无存储<body onunload=“”>html格式缓存控制:无存储(仅限https)

在IE8(v8.0.6001.18702IC)中,以下任何一项都有效:

缓存控制:必须重新验证,最大年龄=0缓存控制:无缓存缓存控制:无存储缓存控制:必须重新验证过期时间:0缓存控制:必须重新验证有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存(仅限https)变量:*(仅限https)

结合以上内容,我们得到了适用于Chrome 28、FireFox 23、IE8、Safari 5.1.7和Opera 12.15的解决方案:缓存控制:无存储,必须重新验证(仅限https)

请注意,需要https,因为Opera不会停用普通http页面的历史缓冲区。如果你真的无法获得https,并且你准备忽略Opera,那么最好的办法就是:

Cache-Control: no-store
<body onunload="">

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

HTTP:

缓存控制:私有,无缓存,无存储,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0过期时间:0Pragma:无缓存变化:*<body onunload=“”>失败:Opera 12.15成功:Chrome 28、FireFox 23、IE8、Safari 5.1.7缓存控制:私有,无缓存,无存储,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*<body onunload=“”>失败:Opera 12.15成功:Chrome 28、FireFox 23、IE8、Safari 5.1.7缓存控制:私有,无缓存,无存储,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0过期时间:0Pragma:无缓存变化:*失败:Safari 5.1.7,Opera 12.15成功:Chrome 28、FireFox 23、IE8缓存控制:私有,无缓存,无存储,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*失败:Safari 5.1.7,Opera 12.15成功:Chrome 28、FireFox 23、IE8缓存控制:私有,无缓存,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0过期时间:0Pragma:无缓存变化:*<body onunload=“”>失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8缓存控制:私有,无缓存,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*<body onunload=“”>失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8缓存控制:私有,无缓存,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0过期时间:0Pragma:无缓存变化:*<body onunload=“”>失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8缓存控制:私有,无缓存,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*<body onunload=“”>失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8缓存控制:无存储失败:Safari 5.1.7,Opera 12.15成功:Chrome 28、FireFox 23、IE8缓存控制:无存储<body onunload=“”>失败:Opera 12.15成功:Chrome 28、FireFox 23、IE8、Safari 5.1.7缓存控制:无缓存失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8变化:*失败:Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15成功:无Pragma:无缓存失败:Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15成功:无缓存控制:私有,无缓存,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*<body onunload=“”>失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8缓存控制:私有,无缓存,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0过期时间:0Pragma:无缓存变化:*<body onunload=“”>失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8缓存控制:必须重新验证,最大年龄=0失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8缓存控制:必须重新验证过期时间:0失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8缓存控制:必须重新验证有效期:1991年10月12日星期六05:00:00 GMT失败:Chrome 28、FireFox 23、Safari 5.1.7、Opera 12.15成功:IE8缓存控制:私有,必须重新验证,代理重新验证,s-maxage=0Pragma:无缓存变化:*<body onunload=“”>失败:Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15成功:无

HTTPS:

缓存控制:私有,最大年龄=0,代理重新验证,s-maxage=0过期时间:0<body onunload=“”>失败:Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15成功:无缓存控制:私有,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMT<body onunload=“”>失败:Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15成功:无变化:*失败:Chrome 28、Safari 5.1.7、Opera 12.15成功:FireFox 23,IE8Pragma:无缓存失败:Chrome 28、Safari 5.1.7、Opera 12.15成功:FireFox 23,IE8缓存控制:无缓存失败:Chrome 28、Safari 5.1.7、Opera 12.15成功:FireFox 23,IE8缓存控制:私有,无缓存,最大年龄=0,代理重新验证,s-maxage=0失败:Chrome 28、Safari 5.1.7、Opera 12.15成功:FireFox 23,IE8缓存控制:私有,无缓存,最大年龄=0,代理重新验证,s-maxage=0过期时间:0Pragma:无缓存变化:*失败:Chrome 28、Safari 5.1.7、Opera 12.15成功:FireFox 23,IE8缓存控制:私有,无缓存,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*失败:Chrome 28、Safari 5.1.7、Opera 12.15成功:FireFox 23,IE8缓存控制:必须重新验证失败:Chrome 28、FireFox 23、IE8、Safari 5.1.7成功:Opera 12.15缓存控制:私有,必须重新验证,代理重新验证,s-maxage=0<body onunload=“”>失败:Chrome 28、FireFox 23、IE8、Safari 5.1.7成功:Opera 12.15缓存控制:必须重新验证,最大年龄=0失败:Chrome 28、FireFox 23、Safari 5.1.7成功:IE8,Opera 12.15缓存控制:私有,无缓存,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*<body onunload=“”>失败:Chrome 28,Safari 5.1.7成功:FireFox 23、IE8、Opera 12.15缓存控制:私有,无缓存,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0过期时间:0Pragma:无缓存变化:*<body onunload=“”>失败:Chrome 28,Safari 5.1.7成功:FireFox 23、IE8、Opera 12.15缓存控制:无存储失败:Opera 12.15成功:Chrome 28、FireFox 23、IE8、Safari 5.1.7缓存控制:私有,无缓存,无存储,最大年龄=0,代理重新验证,s-maxage=0过期时间:0Pragma:无缓存变化:*<body onunload=“”>失败:Opera 12.15成功:Chrome 28、FireFox 23、IE8、Safari 5.1.7缓存控制:私有,无缓存,无存储,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*<body onunload=“”>失败:Opera 12.15成功:Chrome 28、FireFox 23、IE8、Safari 5.1.7缓存控制:私有,无缓存有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*失败:Chrome 28、Safari 5.1.7、Opera 12.15成功:FireFox 23,IE8缓存控制:必须重新验证过期时间:0失败:Chrome 28、FireFox 23、Safari 5.1.7、,成功:IE8,Opera 12.15缓存控制:必须重新验证有效期:1991年10月12日星期六05:00:00 GMT失败:Chrome 28、FireFox 23、Safari 5.1.7、,成功:IE8,Opera 12.15缓存控制:私有,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0过期时间:0<body onunload=“”>失败:Chrome 28、FireFox 23、Safari 5.1.7、,成功:IE8,Opera 12.15缓存控制:私有,必须重新验证,最大年龄=0,代理重新验证,s-maxage=0有效期:1991年10月12日星期六05:00:00 GMT<body onunload=“”>失败:Chrome 28、FireFox 23、Safari 5.1.7、,成功:IE8,Opera 12.15缓存控制:私有,必须重新验证有效期:1991年10月12日星期六05:00:00 GMTPragma:无缓存变化:*失败:Chrome 28,Safari 5.1.7成功:FireFox 23、IE8、Opera 12.15缓存控制:没有存储,必须重新验证失败:无成功:Chrome 28、FireFox 23、IE8、Safari 5.1.7、Opera 12.15