2011-04-10 138 views
16

IIS支持兩種類型的壓縮:靜態內容壓縮和動態內容壓縮。根據applicationHost.config,它們由不同模塊處理:DynamicCompressionModule(compdyn.dll)和StaticCompressionModule(compstat.dll),它們被配置爲壓縮不同類型的請求。另外,我猜測動態壓縮不會緩存壓縮請求,而不是靜態壓縮(默認情況下,壓縮文件保存爲%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files)。IIS7:靜態和動態內容壓縮之間的區別

但是,除了這些明顯的差異之外,我懷疑還有其他的東西。我認爲他們掛鉤到IIS管道的方式略有不同。有人會有更深入的瞭解嗎?

我發現的方式是I was toying with a custom module for modifying CSS files on fly。當打開靜態壓縮(並設置爲處理默認文件集,即text/css)時,對於緩存的請求,我的自定義模塊被提供給已壓縮的內容。當我將text/css移動到動態壓縮請求列表時,它全部開始工作。但是我想要有一個更堅實的證據來證明這是真正做到這一點的正確方法。還有其他一些已知的後果/問題嗎?

更新:我想我可能有一個理論,爲什麼它的發生。它可能不是100%正確的,但它至少可以解釋觀察到的行爲。我認爲,靜態壓縮模塊將自己註冊爲以下事件(其中一些人):

RQ_MAP_REQUEST_HANDLER 
RQ_EXECUTE_REQUEST_HANDLER 

然後,當一個靜態文件的請求提供服務,在OnMapRequestHandler檢查靜態壓縮模塊文件是否已被壓縮之前以及是否實際文件未被更改。如果是這樣,它會將請求重新映射到自身(使用IMapHandlerProvider返回適當的重定向)。當它後來實際服務於OnExecuteRequestHandler中的響應時,它將發送壓縮文件。另一方面,如果該文件之前沒有被壓縮或者如果它已經改變,則它不執行映射重定向並且允許靜態內容模塊服務該請求,並且隨後在OnPostExecuteRequestHandler中壓縮內容(並且更新其緩存) 。如上所述,我並不是說這就是發生了什麼(我不知道源代碼),它可能只是一個近似值。另外,動態壓縮模塊不可能做到這一點。它在RQ_EXECUTE_REQUEST_HANDLER之後有時會壓縮傳出的響應。

回答

12

你的問題不太清楚,所以我會回答一個問題,並希望這是你的問題。

靜態壓縮的目的是壓縮文件,否則直接從硬盤驅動器(Css/images/javascript),因此它壓縮每個文件一次,並將壓縮文件保存到磁盤。這爲非常不經常更改的靜態文件提供了非常快速的非常便宜的壓縮內容服務。說大多數網站應該啓用靜態壓縮是一個非常安全的建議。

動態壓縮的目的是壓縮來自ISS模塊(asp,asp.net,php等)的動態響應。由於每個請求的響應可能不同,壓縮的輸出不能被緩存。該功能是IIS6中的新功能,儘管在某些環境中可以實現該功能,例如,通過在ASP.Net中實現HttpFilter。由於每個請求都需要進行動態壓縮,因此需要更多的CPU資源,然後進行靜態壓縮。所以如果一臺服務器受CPU限制,這可能不是一個好的選擇。大多數網站都是網絡和/或數據庫綁定的,所以這通常是一個好主意。

所以動態和靜態指的是內容和效果,可以使用哪些策略。

一些參考

0

與IIS壓縮功能進行實驗,似乎對我來說,動態模塊和靜態模塊不那麼依賴於動態或靜態內容(尤其是爲動態模塊)。

text/html(或text/*)激活壓縮imime在動態模塊上鍵入,而不是在靜態模塊上。訪問.html文件。檢查瀏覽器中的http響應:它是壓縮的。 (在2008R2服務器上對IIS 7.5進行測試。)

看來動態壓縮模塊並不侷限於動態內容。它會壓縮靜態內容,使其與MIME類型列表相匹配,並且尚未壓縮。所以我認爲它應該被理解爲一個動態的「壓縮模塊」,從某種意義上說,它在每個響應(基於其MIME類型標準,以及accept-encoding請求標頭)上被觸發。

雖然靜態壓縮模塊被觸發有點像處理文件的後臺進程,並且只有在其緩存中有壓縮輸出時纔開始提供壓縮輸出。由於靜態壓縮模塊在模塊堆棧中確實執行得更快,因此它在動態壓縮模塊之前處理響應,因此如果它具有壓縮輸出服務,則優先於動態壓縮模塊。

因此,對於您的特定使用情況,您應該禁用靜態壓縮模塊text/css mime類型(如果存在,請謹防移除text\*)以避免緩存問題,從而導致您的自定義css修補模塊無法正常工作。

此外,您還可以在動態壓縮模塊中激活text/css的壓縮,以替換此情況下的靜態壓縮模塊。但是,當然,它不會利用靜態壓縮模塊緩存功能。

不幸的是,我還沒有發現任何備份上述語句的文檔。

另一種選擇是嘗試更改IIS模塊執行順序。您必須在您的站點配置中將它們全部刪除,然後重新添加它們,在靜態壓縮之前插入您的自定義模塊。但這可能是一條棘手的道路。

相關問題