在沒有實際文件的情況下使用 AddEncoding x-gzip .gz
使用 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>