浏览器似乎忽略了响应缓存控制指令



我正在尝试测试一些缓存配置,我希望我的页面在请求再次到达服务器之前停留1分钟。

使用具有指向自身链接的简单test.asp页面:

<% Option Explicit %>
<%
    Response.Expires = 1
    Response.CacheControl = "private, max-age=60"
%>
<html>
<head><title>test</title></head>
<body>
<% =Now() %>
<br />
<a href="test.asp">test</a>
</body>
</html>

这在我的开发计算机上完美工作http://localhost/test.asp,(单击链接不会在1分钟内刷新打印的日期时间)。

但是,当我将页面放在生产服务器上时,这并不是所需的效果。单击链接仅几秒钟后,我获得了一个新的DateTime,这意味着请求到达Web服务器。

我使用Chrome Dev工具并查看以下响应标头:

HTTP/1.1 200 OK
Cache-Control: private, max-age=60
Content-Type: text/html
Expires: Tue, 12 May 2015 19:16:52 GMT
Last-Modified: Tue, 12 May 2015 19:10:00 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Tue, 12 May 2015 19:15:55 GMT
Content-Length: 205

谁能帮助解释为什么它在产品服务器上不起作用?

更新我尝试了Chrome,Firefox和IE,以及2页test.asp和test2.asp,都有指向另一页的链接,并且在8-12秒后得到了完全相同的问题,页面刷新而不是等待60秒刷新之前。

要跟进我的评论,看来您可能正在查看服务器上的动态ASP页面,而不是在客户端上。在客户端上的缓存实际上对您没有很多好处,因为现代浏览器/代理仍会在其HTML文档时请求该项目。缓存不变的静态资源,例如图像,CSS,JS应该起作用,并且根据高速缓存标头,您将浏览器推出会尊重这些。

要使您的页面在服务器上缓存(这意味着IIS不必重新生成页面),这是您的工作方式。

web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <caching>
            <profiles>
                <add extension=".asp" policy="CacheForTimePeriod" kernelCachePolicy="DontCache" duration="00:01:00" />
            </profiles>
        </caching>
    </system.webServer>
</configuration>

您可以将Web.config放在特定目录中,仅用于缓存其内容,还可以使用Querystring params或某些请求标头打破缓存。

最新更新