客户端缓存 <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) 文章:

  • RFC 1123 - “Internet 主机的要求 - 应用程序和支持”
  • RFC 2616 - “超文本传输协议--HTTP/1.1 ”

兼容性

版本 说明
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 元数据库属性:
  • CacheControlCustom
  • CacheControlMaxAge
  • CacheControlNoCache
  • HttpExpires

安装

<staticContent> 元素的 <clientCache> 元素包含在 IIS 7 及更高版本的默认安装中。

操作方式

如何为网站或应用程序配置缓存过期日期

  1. 打开 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)管理器”。
  2. 在“连接”窗格中,转到要为其禁用缓存的站点、应用程序或目录。

  3. 在“主页”窗格中,双击“HTTP 响应标头”。
    Screenshot that shows the Default Web Site Home pane, with H T T P Response Headers selected.

  4. 在“HTTP 响应头”页的“操作”窗格中单击“设置自定义标头...”。
    Screenshot that shows the H T T P Response Headers pane in the I I S Manager.

  5. 在“设置通用 HTTP 响应标头”对话框中,选中使 Web 内容过期的复选框,选择在特定时间间隔后过期或在特定时间过期的选项,然后单击“确定”。
    Screenshot that shows the Set Common H T T P Response Headers dialog box. Enable H T T P keep alive is selected.
    Screenshot that shows the Set Common H T T P Response Headers dialog box. After is selected under the Expire Web content checkbox.

如何为网站或应用程序禁用缓存

  1. 打开 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)管理器”。
  2. 在“连接”窗格中,转到要为其禁用缓存的站点、应用程序或目录。

  3. 在“主页”窗格中,双击“HTTP 响应标头”。
    Screenshot that shows the Default Web Site Home pane. H T T P Response Headers is selected.

  4. 在“HTTP 响应头”页的“操作”窗格中单击“设置自定义标头...”。
    Screenshot that shows the H T T P Response Headers pane.

  5. 在“设置通用 HTTP 响应标头”对话框中,选中使 Web 内容过期的复选框,选择“立即”,然后单击“确定”。
    Screenshot that shows the Set Common H T T P Response Headers dialog box. Immediately is selected under the Expire Web content checkbox.

配置

特性

属性 说明
cacheControlCustom 可选的字符串属性。

指定自定义 HTTP 1.1 缓存控制指令。
cacheControlMaxAge 可选的 timeSpan 属性。

指定缓存控件值的最大期限(以秒为单位)。

默认值为 1.00:00:00(1 天)。
cacheControlMode 可选的枚举属性。

指定要用于客户端缓存的模式。

cacheControlMode 属性可以是以下可能值之一。

默认为 NoControl
说明
NoControl 不向响应中添加 Cache-Control 或 Expires 标头。

数值为 0
DisableCache 向响应中添加 Cache-Control: no-cache 标头。

数值为 1
UseMaxAge 根据 CacheControlMaxAge 属性中指定的值,向响应中添加 Cache-Control: max-age=<nnn> 标头。

数值为 2
UseExpires 根据 httpExpires 属性中指定的日期,向响应中添加 xpires: <date> 标头。

数值为 3
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()