Apache-2.2

在沒有實際文件的情況下使用 AddEncoding x-gzip .gz

  • June 9, 2012

使用 Apache(2.2 及更高版本)如何實現以下目標。當使用名稱加上副檔名查詢某個文件時,我想使用 GZip 編碼(不是.gz普通的 Deflate)透明地壓縮輸出,其中該.gz版本實際上並不存在於磁碟上。

因此,假設我有一個名為的文件,但在 URI 映射到的文件夾中沒有文件,/path/foo.bar怎樣才能讓 Apache 提供但應用於(不存在的)文件的內容?foo.bar.gz``/path``/path/foo.bar``AddEncoding x-gzip ...

重寫部分似乎很容易,但問題是如何將編碼應用於不存在的項目。只要客戶端支持編碼,另一種方法似乎也很簡單。

唯一的解決方案真的是一個即時執行此操作的腳本嗎?


我知道mod_deflate而且mod_gzip不是我要找的——至少不是一個人。特別是我需要一個實際的 GZIP 文件,而不僅僅是一個放氣的流。

現在我正在考慮使用 mod_ext_filter,但無法彌合將(不存在的)名稱重寫為file.gz一側file和另一側之間的差距LocationMatch。這就是我所擁有的。

RewriteRule ^(.*?\.ext)\.gz$ $1 [L]
ExtFilterDefine gzip mode=output cmd="/bin/gzip"
<LocationMatch "/my-files/special-path/.*?\.ext\.gz">
   AddType application/octet-stream .ext.gz
   SetOutputFilter gzip
   Header set Content-Encoding gzip
</LocationMatch>

請注意,Content-Encoding在這種情況下,客戶端並不真正需要標頭。他們希望看到實際的 GZIP 文件,但我想在不記憶體的情況下即時執行此操作(這是一個測試場景)。

好吧,很抱歉在提供賞金後不久就回答了我自己的答案,但我終於找到瞭如何完成我想要的。我對我的問題的最後一次編輯很接近,但還不夠接近。

事實證明,我可以濫用這樣一個事實,即mod_rewrite讓我設置重寫路徑 ( T=) 的 MIME 類型,以便mod_ext_filter使用如下指令應用我的過濾器 (使用) AddOutputFilterByType

RewriteRule ^(.*?\.ext)\.gz$ $1 [L,T=application/my-file-type]
ExtFilterDefine gzip mode=output cmd="/bin/gzip"
<Location "/my-files">
   AddOutputFilterByType gzip application/my-file-type
</Location>

因此,這樣實際文件(例如somename.ext.gz)不存在,但somename.ext 確實存在,並且mod_rewrite僅當請求帶有副檔名時才會有條件地應用過濾器.ext.gz,但絕不會在請求以(現有)名稱出現時應用過濾器。

我所做的只是發明了我自己的 MIME 類型。


正如 200_success 在他/她的評論中所建議的那樣,我再次對其進行了調整,使其更具可讀性並依賴於環境變數(通過 有條件地設置mod_rewrite):

RewriteRule ^(.*?\.ext)\.gz$ $1 [L,E=NEEDGZIP:1]
ExtFilterDefine gzip mode=output cmd="/bin/gzip" enableenv=NEEDGZIP
<Location "/my-files">
   SetOutputFilter gzip
</Location>

引用自:https://serverfault.com/questions/366956