我理解你的情况。有时它会混淆 IIS 如何处理文件。IIS 6 与 IIS 7 也不同,经典应用程序池和集成模式应用程序池也不同。我的经验主要是使用 IIS 7.5 上的集成应用程序池,所以这是我可以最准确地评论的环境。
第一个问题
但是 IIS 怎么知道什么是静态内容,什么不是呢?
它只是 images , css , js 而不是 ASPX , ashx ......?
我在 IIS 中哪里可以看到什么已经被认为是静态的,什么不是?
您可以通过导航到您的网站来检查 IIS 中的文件处理程序列表,然后单击“处理程序映射”。默认情况下,这些是从 .Net 基础 web.config 继承的,该基础 web.config 位于不同的位置,具体取决于您的 .Net 框架版本。
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config
- C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config
如果所请求的文件尚未显式映射到另一个处理程序,则它属于一个捕获所有处理程序 ( *
) 作为最后一个选项 ( System.Web.DefaultHttpHandler
),该选项确定它是静态文件还是目录浏览请求。所以静态文件只是没有绑定到另一个处理程序的文件。例如,您会看到在此默认处理程序之前*.aspx
已经映射到。System.Web.UI.PageHandlerFactory
因此它将由该处理程序处理,而不是被视为静态文件。如果您删除了该映射,您可以在技术上将 *.aspx 作为静态文件提供(如果您真的想要)(只是为了证明它是如何工作的)。
System.Web.StaticFileHandler
但是您也可以通过在 web.config 的 httpHandlers 部分中添加一个条目,将文件扩展名映射到IIS 中,从而将文件类型显式列为静态文件。例如:
<configuration>
<system.webServer>
<handlers>
<add name="StaticHandler" verb="*" path="*.zip" type="System.Web.StaticFileHandler" preCondition="integratedMode" />
</handlers>
</system.webServer>
</configuration>
此示例使用config 部分,因此它适用于以集成模式<system.webServer>
运行的应用程序池。
第二个问题
使用 <%@ OutputCache header(without location) 声明页面的情况如何。里面的图像、css、js src 文件是否也使用相同的属性缓存输出?
不,因为页面作为单独的请求(甚至可能由单独的处理程序)作为服务器,它可以具有完全不同的缓存标头/提示。从缓存的角度来看,主机页面和它可能使用的资源是不相关的。
事实上,您甚至可能希望 *.html 的缓存期更短,*.jpg 或 *.png 的缓存期更长?需要考虑的事情。
第三个问题
作为最佳实践,我应该将未来一年设置为最长到期时间。我应该将其用作网站上所有静态内容的默认值
嗯......我可能不会去一年。一个月怎么样?我会制定这样的全球政策:
<configuration>
<system.webServer>
<staticContent>
<!-- Set expire headers to 30 days for static content-->
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
</staticContent>
</system.webServer>
</configuration>
这与您在上面显示的示例相同,但不在<location>
元素内,而是在根<configuration>
元素中,因此它是默认策略。这同样适用于以集成模式运行的应用程序池。有时还需要开启:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<!-- stuff -->
</modules>
</system.webServer>
<system.webServer>
这只是确保通过尊重上述配置元素的托管静态文件处理程序处理静态文件。
编辑地址评论
您在上面发布的配置对话框的文档位于此处:Configure the HTTP Expires Response Header (IIS 7)
显然这些设置保存在C:\Windows\System32\inetsrv\config\applicationHost.config
我没有 IIS7,现在个人在 IIS 7.5 上开发。因此,如果您可以验证此位置是否准确,请发表评论!