当前位置: 首页 > 面试题库 >

我们如何在所有浏览器中控制网页缓存?

马业
2023-03-14
问题内容

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

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

  • Internet Explorer 6+
  • Firefox 1.5+
  • Safari 3+
  • Opera 9+
  • Chrome

问题答案:

介绍
适用于所有提到的客户端(和代理)的正确的最小标头集:

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

该Cache-Control是每HTTP 1.1规范,为客户和代理(和一些客户需要隐旁边Expires)。根据Pragma史前客户端的HTTP 1.0规范。根据Expires客户端和代理的HTTP 1.0和1.1规范。在HTTP 1.1中,Cache-Control优先级高于Expires,因此仅适用于HTTP 1.0代理。

如果仅通过HTTPS提供页面时,如果您不在意IE6及其缓存中断no-store,那么您可以省略Cache-Control: no-cache。

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

如果您不关心IE6或HTTP 1.0客户端(HTTP 1.1于1997年推出),则可以忽略Pragma。

Cache-Control: no-store, must-revalidate
Expires: 0

如果您也不关心HTTP 1.0代理,则可以省略Expires。

Cache-Control: no-store, must-revalidate

另一方面,如果服务器自动包含有效的Date标头,则从理论上讲,您也可以忽略它Cache-Control而Expires仅依赖它。

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

但这可能会失败,例如,如果最终用户操纵了操作系统日期,而客户端软件则依赖它。

如果指定了上述参数,则其他Cache-Control参数如max-age无关紧要Cache-Control。仅在您确实要缓存请求时,Last-Modified此处大多数其他答案中包含的标头才是有趣的,因此您根本不需要指定它。

如何设置?
使用PHP:

header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.

使用Java Servlet或Node.js

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.

使用ASP.NET-MVC

Response.Cache.SetCacheability(HttpCacheability.NoCache);  // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
使用ASP.NET Web API:

// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
    NoCache = true,
    NoStore = true,
    MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString()); 

使用ASP.NET:

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

使用ASP.NET Core v3

// using Microsoft.Net.Http.Headers
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
Response.Headers[HeaderNames.Expires] = "0";
Response.Headers[HeaderNames.Pragma] = "no-cache";

使用ASP:

Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.

使用Ruby on Rails或Python / Flask:

headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.

使用Python / Django:

response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.

使用Python /金字塔:

request.response.headerlist.extend(
    (
        ('Cache-Control', 'no-cache, no-store, must-revalidate'),
        ('Pragma', 'no-cache'),
        ('Expires', '0')
    )
)

使用Go:

responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.

使用Apache.htaccess文件:

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

使用HTML:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

HTML元标记与HTTP响应标头
重要的是要知道,当通过HTTP连接为HTML页面提供服务,并且HTTP响应标头和HTML标记中都存在标头时<meta http-equiv>,则HTTP响应标头中指定的标头将优先于HTML meta标记。仅当通过file://URL从本地磁盘文件系统查看页面时,才使用HTML元标记。另请参阅W3 HTML规范第5.2.2章。当您不以编程方式指定它们时,请务必小心,因为Web服务器可以包含一些默认值。

通常,最好不要指定HTML元标记,以免引起初学者的困惑,并依靠硬HTTP响应标头。此外,尤其是这些<meta http-equiv>标记在HTML5中无效。仅允许HTML5规范中http-equiv列出的值。

验证实际的HTTP响应标头
要验证彼此,可以在webbrowser开发人员工具集的HTTP流量监视器中查看/调试它们。您可以通过在Chrome / Firefox23 + / IE9 +中按F12,然后打开“网络”或“网络”标签面板,然后单击感兴趣的HTTP请求以发现有关HTTP请求和响应的所有详细信息,来到达那里。在下面的截图是从Chrome中:

Chrome开发人员工具集HTTP流量监视器,上显示HTTP响应标头
我也想在文件下载中设置这些标题
首先,此问题和答案针对“网页”(HTML页面),而不是“文件下载”(PDF,zip,Excel等)。您最好将它们缓存起来,并在URI路径或querystring中的某处使用一些文件版本标识符,以强制在更改的文件上重新下载。无论如何,当在文件下载上应用这些无缓存头时,请注意在通过HTTPS而非HTTP提供文件下载服务时的IE7 / 8错误。



 类似资料:
  • 我可以强制浏览器缓存WPS 6.1响应的页面吗? 强制浏览器缓存页面是满足要求的一种方式吗? 我尝试创建一个过滤器并在wps中配置它。 它正在工作,但HTTP标头仍然是: 缓存控制无缓存 内容语言en US 内容类型文本/html;charset=UTF-8 日期2012年5月11日星期五07:50:19 GMT 到期时间1970年1月1日星期四00:00:00 GMT IBM-Web2-Loca

  • 我们如何在网络浏览器中使用AWS Kinesis? 我对AWS的Kinesis流感兴趣,想知道我是否可以使用它将用户的活动日志直接从他们的浏览器发送到AWS。 AWS提供了一个可以在web浏览器中执行的JavaScript SDK,但是根据它的文档,该SDK需要凭证信息,因此,我认为在我的用例中使用它是不安全的。

  • 问题内容: 背景 我正在为两个公益网站编写和使用一个非常简单的基于CGI的(Perl)内容管理工具。它为网站管理员提供事件的HTML表单,这些表单将填写字段(日期,位置,标题,描述,链接等)并保存。在该表格上,我允许管理员上传与事件相关的图像。在显示表单的HTML页面上,我还显示了上传图片的预览(HTML img标签)。 问题 当管理员想要更改图片时,会发生此问题。他只需要点击“浏览”按钮,选择一

  • 问题内容: 如何处理HTML页面中的TIFF文件? 我想在HTML页面中显示TIFF文件。 我尝试使用嵌入式标签,对象ID,IMG等。但是我无法在HTML页面中显示图像(TIFF)。 我在项目中没有使用Java,.NET或其他任何东西。我仅使用HTML。 更新:Safari支持TIFF图像加载。如何在其他浏览器(IE,Mozilla,Firefox等)中加载TIFF图像? 我无法安装第三方插件或控

  • 我试图制作一个自定义登录表单,如果用户有role_user的话,将用户重定向到一个学生页面。 在VIEWS文件夹中,我有一个页面注销,一个名为LOGIN和LOGIN.jsp以及tiles-definitions.xml的文件夹,还有一个名为STUDENT和STUDENT.jsp文件的文件夹。

  • 问题内容: 有什么办法可以在页面上放置一些代码,以便当有人访问网站时,它会清除浏览器缓存,以便他们可以查看更改? 使用的语言:ASP.NET,VB.NET,当然还有HTML,CSS和jQuery。 问题答案: 如果这是关于和变化,一种方法是到“缓存无效”是通过附加像“ ”为每个版本的文件名。例如: 或者,在文件名之后执行此操作: