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

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

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

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


当前回答

我发现这一页上的所有答案仍然存在问题。特别是,我注意到,当您通过单击后退按钮访问页面时,它们都不会阻止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的答案。

其他回答

在我的情况下,我用这个解决了chrome中的问题

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

当用户出于安全原因单击“返回”按钮时,我需要清除先前表单数据的内容

当使用浏览器的后退按钮时,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

我用这种方式解决了。

2个注意事项:

1) 服务器端事件不是在后退单击时触发的,而是javascript。

2) 我有两个javascript来读/写cookie

function setCookie(name, value, days)
{
    var expires = "";
    if (days)
    {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "") + expires + "; path=/";
}

function getCookie(name)
{
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');

    for (var i = ca.length - 1; i >= 0; i--)
    {
        var c = ca[i];
        while (c.charAt(0) == ' ')
        {
            c = c.substring(1, c.length);
        }

        if (c.indexOf(nameEQ) == 0)
        {
            return c.substring(nameEQ.length, c.length);
        }
    }
    return null;
}

在我的Page_Load中,我插入了以下内容:(这不是在单击后启动的)

    protected void Page_Load(object sender, EventArgs e)
    {
       Page.RegisterClientScriptBlock("", "<script>setCookie('" + Session.SessionID + "', '" + Login + "', '100');</script>");
    }

其中“Login”是我的id值,注销后为-1(可以使用其他值,例如布尔值)。

然后在我的页面中添加了以下内容:(这是在单击后启动的)

<script type="text/javascript">
if (getCookie('<%= Session.SessionID %>') < 0)
        {
            if (history.length > 0)
            {
                history.go(+1);
            }
        }

</script>

没有别的。

使用此解决方案,仅在同一浏览器上的每个页面注销后,才在每个页面上启用反向单击。

我发现这一页上的所有答案仍然存在问题。特别是,我注意到,当您通过单击后退按钮访问页面时,它们都不会阻止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的答案。