客户端缓存 <clientCache>
概述
<staticContent>
元素的 <clientCache>
元素指定 IIS 7 及更高版本发送到 Web 客户端的与缓存相关的 HTTP 标头,这些标头控制 Web 客户端和代理服务器将如何缓存 IIS 7 及更高版本返回的内容。
例如,httpExpires 属性指定内容应过期的日期和时间,IIS 7 及更高版本将向响应添加 HTTP“Expires”标头。 httpExpires 属性的值必须是符合 RFC 1123 中的规范的完全格式日期和时间。 例如:
Fri, 01 Jan 2010 12:00:00 GMT
注意
若要使用 httpExpires 属性,需要将 cacheControlMode 属性的值设置为 UseExpires。
征求意见文档 (RFC) 2616 中的 HTTP 1.1 规范为 HTTP 的“Cache-Control”标头指定了几个可能的值,例如“no-cache”、“private”、“public”等。这些标头值中的每一个都让 Web 客户端和代理服务器知道它们是否应该缓存内容:
任何实体都不应缓存包含“no-cache”标头的内容。 - 包含“private”标头的内容不应由代理服务器缓存,但可由 Web 客户端缓存。 - 包含“public”标头的内容可由任何实体缓存。
注意
上述列表并不全面 - “Cache-Control”标头还可以指定许多其他值。
可以将其他指令添加到 HTTP 的“Cache-Control”标头,例如“max-age”,该标头指定内容的显式过期时间。 在 IIS 7 中,“max-age”指令是通过 cacheControlMaxAge 属性配置的。 虽然“Expires”和“max-age”设置有点相似,但“max-age”指令优先于“Expires”。
注意
若要使用 cacheControlMaxAge 属性,需要将 cacheControlMode 属性的值设置为 UseMaxAge。
有关 HTTP 缓存标头和日期/时间格式的详细信息,请参阅以下征求意见文档 (RFC) 文章:
兼容性
版本 | 说明 |
---|---|
IIS 10.0 | <clientCache> 元素在 IIS 10.0 中未进行修改。 |
IIS 8.5 | <clientCache> 元素在 IIS 8.5 中未进行修改。 |
IIS 8.0 | 添加了 setEtag 属性以指定是否计算和设置 HTTP ETag 标头。 |
IIS 7.5 | <clientCache> 元素在 IIS 7.5 中未进行修改。 |
IIS 7.0 | IIS 7.0 中引入了 <staticContent> 元素的 <clientCache> 元素。 |
IIS 6.0 | <clientCache> 元素替换以下 IIS 6.0 元数据库属性:
|
安装
<staticContent>
元素的 <clientCache>
元素包含在 IIS 7 及更高版本的默认安装中。
操作方式
如何为网站或应用程序配置缓存过期日期
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet 信息服务(IIS)管理器”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet 信息服务(IIS)管理器”。
在“连接”窗格中,转到要为其禁用缓存的站点、应用程序或目录。
在“设置通用 HTTP 响应标头”对话框中,选中使 Web 内容过期的复选框,选择在特定时间间隔后过期或在特定时间过期的选项,然后单击“确定”。
如何为网站或应用程序禁用缓存
打开 Internet Information Services (IIS) 管理器:
如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:
- 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows 8 或 Windows 8.1:
- 按住 Windows 键,按字母 X,然后单击“控制面板”。
- 单击“管理工具”,然后双击“Internet 信息服务(IIS)管理器”。
如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:
- 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”。
如果使用的是 Windows Vista 或 Windows 7:
- 在任务栏上,单击“开始”,然后单击“控制面板”。
- 双击“管理工具”,然后双击“Internet 信息服务(IIS)管理器”。
在“连接”窗格中,转到要为其禁用缓存的站点、应用程序或目录。
配置
特性
属性 | 说明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
cacheControlCustom |
可选的字符串属性。 指定自定义 HTTP 1.1 缓存控制指令。 |
||||||||||
cacheControlMaxAge |
可选的 timeSpan 属性。 指定缓存控件值的最大期限(以秒为单位)。 默认值为 1.00:00:00 (1 天)。 |
||||||||||
cacheControlMode |
可选的枚举属性。 指定要用于客户端缓存的模式。 cacheControlMode 属性可以是以下可能值之一。 默认为 NoControl 。
|
||||||||||
httpExpires |
可选的字符串属性。 指定在客户端上缓存的页被视为过时的日期和时间。 (日期和时间的格式根据征求意见文档 1123 中的规范进行设置。)该值将返回到 HTML 文件标头中的浏览器。 用户代理将给定值与当前日期进行比较,以确定是显示缓存页还是从服务器请求更新的页面。 |
||||||||||
setEtag |
可选布尔属性。 指定是否计算并设置 HTTP ETag 标头。 ETag 标头用于 Web 缓存验证,如果尚未对内容进行更改,则 Web 服务器无需发送完整响应。 可以在配置编辑器中的 system.webServer/staticContent 路径中设置 setEtag 。默认值为 true 。 |
子元素
无。
配置示例
以下配置示例向响应中添加 HTTP 标头“Cache-Control: no-cache”标头,从而禁用请求缓存。
<configuration>
<system.webServer>
<staticContent>
<clientCache cacheControlMode="DisableCache" />
</staticContent>
</system.webServer>
</configuration>
以下配置示例向响应中添加 HTTP 标头 HTTP“Expires: Tue, 19 Jan 2038 03:14:07 GMT”,该标头将请求配置为从现在起几年过期。
<configuration>
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseExpires"
httpExpires="Tue, 19 Jan 2038 03:14:07 GMT" />
</staticContent>
</system.webServer>
</configuration>
代码示例
以下代码示例向响应中添加 HTTP 标头“Cache-Control: no-cache”标头,从而禁用请求缓存。
AppCmd.exe
appcmd.exe set config "Default Web Site" -section:system.webServer/staticContent /clientCache.cacheControlMode:"DisableCache"
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using(ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetWebConfiguration("Default Web Site");
ConfigurationSection staticContentSection = config.GetSection("system.webServer/staticContent");
ConfigurationElement clientCacheElement = staticContentSection.GetChildElement("clientCache");
clientCacheElement["cacheControlMode"] = @"DisableCache";
serverManager.CommitChanges();
}
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetWebConfiguration("Default Web Site")
Dim staticContentSection As ConfigurationSection = config.GetSection("system.webServer/staticContent")
Dim clientCacheElement As ConfigurationElement = staticContentSection.GetChildElement("clientCache")
clientCacheElement("cacheControlMode") = "DisableCache"
serverManager.CommitChanges()
End Sub
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site";
var staticContentSection = adminManager.GetAdminSection("system.webServer/staticContent", "MACHINE/WEBROOT/APPHOST/Default Web Site");
var clientCacheElement = staticContentSection.ChildElements.Item("clientCache");
clientCacheElement.Properties.Item("cacheControlMode").Value = "DisableCache";
adminManager.CommitChanges();
VBScript
Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site"
Set staticContentSection = adminManager.GetAdminSection("system.webServer/staticContent", "MACHINE/WEBROOT/APPHOST/Default Web Site")
Set clientCacheElement = staticContentSection.ChildElements.Item("clientCache")
clientCacheElement.Properties.Item("cacheControlMode").Value = "DisableCache"
adminManager.CommitChanges()
以下代码示例向响应中添加 HTTP 标头 HTTP“Expires: Tue, 19 Jan 2038 03:14:07 GMT”,该标头将请求配置为从现在起几年过期。
AppCmd.exe
appcmd.exe set config "Default Web Site" -section:system.webServer/staticContent /clientCache.cacheControlMode:"UseExpires"
appcmd.exe set config "Default Web Site" -section:system.webServer/staticContent /clientCache.httpExpires:"Tue, 19 Jan 2038 03:14:07 GMT"
C#
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample
{
private static void Main()
{
using(ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetWebConfiguration("Default Web Site");
ConfigurationSection staticContentSection = config.GetSection("system.webServer/staticContent");
ConfigurationElement clientCacheElement = staticContentSection.GetChildElement("clientCache");
clientCacheElement["cacheControlMode"] = @"UseExpires";
clientCacheElement["httpExpires"] = @"Tue, 19 Jan 2038 03:14:07 GMT";
serverManager.CommitChanges();
}
}
}
VB.NET
Imports System
Imports System.Text
Imports Microsoft.Web.Administration
Module Sample
Sub Main()
Dim serverManager As ServerManager = New ServerManager
Dim config As Configuration = serverManager.GetWebConfiguration("Default Web Site")
Dim staticContentSection As ConfigurationSection = config.GetSection("system.webServer/staticContent")
Dim clientCacheElement As ConfigurationElement = staticContentSection.GetChildElement("clientCache")
clientCacheElement("cacheControlMode") = "UseExpires"
clientCacheElement("httpExpires") = "Tue, 19 Jan 2038 03:14:07 GMT"
serverManager.CommitChanges()
End Sub
End Module
JavaScript
var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site";
var staticContentSection = adminManager.GetAdminSection("system.webServer/staticContent", "MACHINE/WEBROOT/APPHOST/Default Web Site");
var clientCacheElement = staticContentSection.ChildElements.Item("clientCache");
clientCacheElement.Properties.Item("cacheControlMode").Value = "UseExpires";
clientCacheElement.Properties.Item("httpExpires").Value = "Tue, 19 Jan 2038 03:14:07 GMT";
adminManager.CommitChanges();
VBScript
Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST/Default Web Site"
Set staticContentSection = adminManager.GetAdminSection("system.webServer/staticContent", "MACHINE/WEBROOT/APPHOST/Default Web Site")
Set clientCacheElement = staticContentSection.ChildElements.Item("clientCache")
clientCacheElement.Properties.Item("cacheControlMode").Value = "UseExpires"
clientCacheElement.Properties.Item("httpExpires").Value = "Tue, 19 Jan 2038 03:14:07 GMT"
adminManager.CommitChanges()