如何禁用通过IIS提供的单页面应用程序HTML文件的缓存?

时间:2014-10-28 04:21:43

标签: asp.net angularjs caching iis single-page-application

我有一个单页面应用程序(angular-js),它通过IIS提供。如何防止HTML文件的缓存?需要通过更改index.html或web.config中的内容来实现解决方案,因为无法通过管理控制台访问IIS。

我目前正在调查的一些选项是:

IIS是带有.NET framework 4的7.5版

6 个答案:

答案 0 :(得分:35)

将以下内容添加到web.config解决方案中,适用于Chrome,IE,Firefox和Safari:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <location path="index.html">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Cache-Control" value="no-cache" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>

</configuration>

这将确保在请求Cache-Controlno-cache标头设置为index.html

答案 1 :(得分:11)

对于.NET Core,我使用了以下内容。

        app.UseStaticFiles(new StaticFileOptions
        {
            OnPrepareResponse = context =>
            {                   
                if (context.File.Name == "index.html" ) {
                    context.Context.Response.Headers.Add("Cache-Control", "no-cache, no-store");
                    context.Context.Response.Headers.Add("Expires", "-1");
                }
            }
        });

归功于How to disable browser cache in ASP.NET core rc2?

答案 2 :(得分:5)

提供html文件时,可以附加随机查询字符串。即使文件位于浏览器缓存中,这也会阻止浏览器使用旧版本。

/index.html?rnd=timestamp

另一个选项是在IIS级别添加no-cache设置。这会在响应中添加Cache-Control:no-cache,告诉浏览器不缓存文件。它从IIS 7开始运行。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <!-- Note the use of the 'location' tag to specify which 
       folder this applies to-->
  <location path="index.html">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="DisableCache" />
      </staticContent>
    </system.webServer>
  </location>
</configuration>

答案 3 :(得分:3)

  <meta http-equiv="cache-control" content="no-cache, must-revalidate, post-check=0, pre-check=0">

  

答案 4 :(得分:1)

将以下内容添加到可在Chrome,IE,Firefox和Safari中运行的web.config解决方案中:

这将确保在请求index.html时,将Cache-Control标头设置为no-cache。

答案 5 :(得分:0)

SPA 的主要前提是从不缓存 index.html

MDN recommendations to prevent caching 之后,我们必须添加 Cache-Control HTTP 标头和 no-store, max-age= 0 资源的值(在我们的例子中是 index.html 文件)。

为什么no-store而不是no-cache

no-store,资源不会存储任何地方。使用no-cache,可以存储资源,但在使用之前应该由存储与服务器验证。

为什么 max-age=0

强制清除预先存在的有效缓存响应(no-store 不会)。

在 IIS 中,我们可以通过 web.config 文件管理我们的应用缓存配置。这是一个完整的 web.config 文件(必须位于我们应用程序的根目录中),其中包括 index.html 文件的缓存配置以及路由配置(我已经添加了 SPA 路由和 HTTP 重定向到 HTTPS 作为示例):

<configuration>
  <location path="index.html">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Cache-Control" value="no-store, max-age=0" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="HTTP to HTTPS" enabled="true" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTPS}" pattern="^OFF$" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" />
        </rule>
        <rule name="SPA Routes" enabled="true" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="/index.html" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>