【问题标题】:Browsers seem to ignore response cache-control instruction浏览器似乎忽略了响应缓存控制指令
【发布时间】:2015-05-12 19:41:48
【问题描述】:

我正在尝试测试一些缓存配置,我希望我的页面在请求再次到达服务器之前在缓存中停留 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 分钟内刷新打印的日期时间)。

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

我使用 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

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

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

【问题讨论】:

  • 你是如何测试的?在同一选项卡中刷新?这可能是一个 chrome 问题:stackoverflow.com/questions/11245767/… 它在您的开发环境中运行的原因可能是 Chrome 无论如何都使用 'localhost' url 做一些时髦的事情..
  • 我正在通过单击链接到自身的测试页面中的超链接进行测试。使用刷新按钮总是将请求发送到逻辑上的服务器。我会尝试使用其他浏览器,也可能不止一页。
  • 太棒了!既然我刚刚开始赏金并再次尝试相同的代码,问题就神奇地消失了,到底是什么:|
  • 当您在浏览器上进行刷新时,通常的行为是为 html 内容重新加载整个页面。我想你是在寻找 IIS 输出缓存来缓存服务器上的页面?
  • 您确定示例响应标头属于 asp 响应吗?我问是因为有一个Last-Modified,它是一个静态内容标头,无法从 asp 发送。你是手动添加的吗?

标签: asp-classic browser-cache http-caching


【解决方案1】:

要跟进我的评论,看起来您可能正在考虑在服务器上缓存您的动态 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 放置在特定目录中仅用于缓存其内容,您还可以使用查询字符串参数或某些请求标头来中断缓存。

【讨论】:

  • 我不能轻易使用 IIS 输出缓存,因为它是私有缓存(页面内容因每个用户而异)。你说:“在客户端缓存对你没有多大好处,因为现代浏览器/代理仍然会在它是 HTML 文档时请求该项目”你能解释更多吗?如果客户端缓存响应标头设置正确,为什么浏览器会请求服务器?
  • 您可以使用 iis 输出缓存并根据参数进行更改,也可以根据不同的标头值进行更改,您可以在您的 asp 脚本中发送您自己,或者您可以根据 IP 地址进行更改。但是,如果您的页面非常不同,那么 IIS 上的输出缓存会占用资源,因为内存中每个页面的版本太多> 至于我之前的评论,我唯一一次从缓存响应中获得静态响应项目(图像,js,css)。对于内容类型的 html,chrome 似乎总是请求页面。我不知道为什么,我在 Nginx 和 IIS 上得到了同样的行为
猜你喜欢
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
相关资源
最近更新 更多