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

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

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

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


当前回答

对于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<NoCacheMiddleware>();

确保在以下位置添加此

app.UseStaticFiles();

其他回答

除了标题之外,还可以考虑通过https为页面提供服务。许多浏览器默认不会缓存https。

当使用浏览器的后退按钮时,BalusC提供的答案中的标题不会阻止Safari 5(以及可能更旧的版本)显示浏览器缓存中的内容。防止这种情况的一种方法是在body标记中添加一个空onunload事件处理程序属性:

<body onunload=""> 

这个黑客显然破坏了Safari中的前向缓存:当单击后退按钮时,是否存在跨浏览器加载事件?

正如@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

请参阅此链接以获取有关缓存的案例研究:

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

总之,根据文章,只有缓存控制:没有商店在Chrome、Firefox和IE上运行。IE接受其他控制,但Chrome和Firefox不接受。该链接是一个很好的阅读,包括缓存和记录概念证明的历史。

如果您面临通过SSL和cache:MS Office文件的IE6-IE8下载问题,则可以在POST请求时使用cache:private、no store header和return file。它起作用了。