angularjs 如何禁用缓存单页应用程序HTML文件通过IIS服务?

oaxa6hgo  于 2023-06-04  发布在  Angular
关注(0)|答案(7)|浏览(579)

我有一个通过IIS提供服务的单页应用程序(angular-js)。如何防止缓存HTML文件?该解决方案需要通过更改index.html或web.config中的内容来实现,因为通过管理控制台访问IIS是不可能的。
我目前正在研究的一些选择是:

IIS版本为7.5,带有.NET Framework 4

1mrurvl1

1mrurvl11#

将以下内容添加到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>

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

csga3l58

csga3l582#

对于.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");
                }
            }
        });

如何在ASP.NET核心rc2中禁用浏览器缓存?

tvmytwxo

tvmytwxo3#

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

按照MDN建议防止缓存,我们必须将***Cache-Control***HTTP头与***no-store,max-age=0***值添加到资源(本例中为 * index.html * 文件)。

*为什么 * 不存储 * 而不是 * 不缓存

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>
qacovj5a

qacovj5a4#

当你的html文件,你可以附加一个随机的查询字符串。这将防止浏览器使用旧版本,即使文件在浏览器缓存中。

/index.html?rnd=timestamp

另一个选项是在IIS级别添加无缓存设置。这将添加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>
70gysomp

70gysomp5#

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

gojuced76#

这些答案对我都不起作用,因为正如@MichailMichailidis提到的,“* SPA中的所有请求都有虚拟URL,并且不Map到真实的位置路径 *”,所以location path永远不会匹配index.html
我在这个blog post中找到了解决方案,它链接到这个答案。这两篇文章都向您展示了如何使用rewrite模块的outboundRules根据条件更改cache-control响应头。
这就是我的web.config在配置后的样子:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <outboundRules>
        <rule name="RewriteCacheControlForIndexHtmlFile" 
          preCondition="IsIndexHtmlFile">
          <match serverVariable="RESPONSE_Cache_Control" pattern=".*" />
          <action type="Rewrite" value="max-age=0" />
        </rule>
        <preConditions>
          <preCondition name="IsIndexHtmlFile">
            <add input="{REQUEST_FILENAME}" pattern="index.html" />
          </preCondition>
        </preConditions>
      </outboundRules>
...
qacovj5a

qacovj5a7#

对于我的情况,以前的答案都不起作用,但我找到了另一种方法,通过过滤响应内容类型
只需在web.config中添加以下内容

...
<system.webServer>
    <rewrite>
        <outboundRules>
            <rule name="RewriteCacheControlForHtmlFile" preCondition="IsHtmlFile">
                <match serverVariable="RESPONSE_Cache_Control" pattern=".*" />
                <action type="Rewrite" value="no-store, max-age=0" />
            </rule>
            <preConditions>
                <preCondition name="IsHtmlFile">
                    <add input="{RESPONSE_CONTENT_TYPE}" pattern="html$" />
                </preCondition>
            </preConditions>
...

相关问题