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

16 浏览
0 Comments

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

我有一个通过IIS提供服务的单页应用(angular-js)。如何防止HTML文件的缓存?解决方案需要通过更改index.html或web.config中的内容来实现,因为无法通过管理控制台访问IIS。\n我目前正在研究一些选项:\n- web.config缓存配置文件 - http://www.iis.net/configreference/system.webserver/caching\n- web.config客户端缓存 - http://www.iis.net/configreference/system.webserver/staticcontent/clientcache\n- meta标签 - 使用标签在所有浏览器中关闭缓存?\nIIS版本为7.5,使用.NET Framework 4。

0
0 Comments

单页应用程序(SPA)的主要前提是“永远不要缓存index.html”。

根据MDN的建议,我们必须为资源(在我们的情况下是index.html文件)添加Cache-Control HTTP头,并将其值设置为no-store, max-age=0。

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

使用no-store,资源不会被存储在任何地方。使用no-cache,资源可能会被存储,但在使用之前必须通过存储器与服务器进行验证。

为什么是max-age=0?

强制清除现有的有效缓存响应(no-store不会这样做)。

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


  
    
      
        
          
        
      
    
  
  
    
      
        
          
          
            
          
          
        
        
          
          
            
            
          
          
        
      
    
  

以上是解决在IIS中禁用单页应用程序HTML文件缓存的原因和解决方法。

0
0 Comments

问题的原因:在单页面应用程序中,通过IIS提供的HTML文件会被缓存,但有时我们需要禁用缓存以解决问题。

解决方法:对于.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");
        }
    }
});

此代码片段将在访问特定的HTML文件(例如index.html)时,向响应头中添加禁用缓存的标头。

要注意的是,如果使用了UseSpa,则应使用spa.DefaultPageStaticFileOptions。并且不需要使用if语句,因为DefaultPageStaticFileOptions只会在访问index.html时触发。

这样,就可以通过上述代码禁用通过IIS提供的单页面应用程序HTML文件的缓存。

0
0 Comments

问题的原因是在IIS服务器上,通过单页应用程序(SPA)提供的HTML文件会被缓存,导致页面内容不能更新。解决方法是在web.config文件中添加以下内容:



  
    
      
        
          
        
      
    
  

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

某些情况下,当命中的URL中直接包含index.html时,这种解决方法有效。但SPA中的所有请求都是虚拟URL,并不映射到实际的位置路径。可以尝试将路径添加为规则中的一部分。

另外,有人指出,Cache-Control: no-cache并不是直接禁用缓存,而是强制客户端与服务器进行验证。因此,它需要与etag头或不可靠的last-modified头一起使用,但并不完全禁用缓存。从MDN关于no-cache的解释中可以得知:"缓存必须在使用缓存副本之前与服务器进行验证。"换句话说,如果服务器没有返回304响应,浏览器仍然可以使用缓存副本。

为了解决这个问题,可以确保通配符重写规则是``,或者参考给出的链接以获取完整的Web.config配置。

0