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

Jon*_*han 7 http-caching asp-classic browser-cache

我正在尝试测试一些缓存配置,我希望我的页面在请求再次到达服务器之前保留在缓存中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>
Run Code Online (Sandbox Code Playgroud)

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

但是,当我将页面放在生产服务器上时,它没有达到预期的效果.点击链接仅几秒钟后,我得到一个新的日期时间,意味着请求到达了Web服务器.

我使用Chrome开发工具查看这些响应标头:

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
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助解释为什么它不能在prod服务器上工作?

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

Fra*_*ank 0

为了跟进我的评论,看起来您可能正在考虑在服务器上而不是在客户端上缓存动态 asp 页面。客户端上的缓存实际上并没有多大好处,因为现代浏览器/代理在 HTML 文档时仍然会请求该项目。缓存不会更改的静态资源(例如图像、CSS、JS)应该可以工作,并且根据您推出的缓存标头,浏览器将尊重这些资源。

要让您的页面缓存在服务器上(意味着 IIS 不必重新生成页面),您可以按照以下方法进行操作。

网页配置

<?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>
Run Code Online (Sandbox Code Playgroud)

您可以将 web.config 放置在特定目录中以仅缓存其内容,您还可以使用查询字符串参数或某些请求标头来中断缓存。