IIS 和靜態內容?
根據Ultra-Fast ASP.NET:第 3 章 - 記憶體:
瀏覽器從伺服器檢索的文件應盡可能長時間地儲存在瀏覽器的記憶體中,以幫助最大程度地減少伺服器往返次數。
- 但是 IIS 是如何知道靜態內容實際上是什麼以及不是什麼?
它只是圖像、CSS、JS而不是ASPX、ashx ……?
我在 IIS 中哪裡可以看到什麼已經被認為是靜態的,什麼不是?
- 如果頁面已聲明為
<%@ OutputCacheheader(不帶location),情況會怎樣?它內部的images,CSS和JS源文件是否也以相同的屬性記憶體輸出?- 作為最佳實踐,我應該將未來一年設置為最長到期時間。我應該使用它作為網站上所有靜態內容的預設值
所以我這樣做了:
但後來,按 後
OK,我找不到任何顯示我的摘要菜單:我已經向誰放置了響應頭(在本例中:css文件夾)。目前,為了看到該文件夾已應用響應標頭 - 我必須再次
css轉到該css文件夾Http Response Header Set Common Headers然後我看到它。它沒有寫在 web.config 中。-->``-->``-->但是,如果我為文件(
Login.aspx例如)執行此操作:我確實在 web.config 中看到了它:<configuration> <location path="Login.aspx"> <system.webServer> <staticContent> <clientCache cacheControlMode="UseExpires" cacheControlMaxAge="1.00:00:00" httpExpires="Fri, 15 Feb 2013 00:00:00 GMT" /> </staticContent> </system.webServer> </location> </configuration>
我理解你的情況。有時它會混淆 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 上開發。因此,如果您可以驗證此位置是否準確,請發表評論!
