使用 AddEncoding x-gzip .gz 而不使用实际文件

使用 AddEncoding x-gzip .gz 而不使用实际文件

使用 Apache(2.2 及更高版本),我如何实现以下目标。我想使用 GZip 编码透明地压缩(不是当使用文件名称和扩展名来查询某个文件时,输出的内容为普通的 Deflate .gz,但文件.gz版本在磁盘上实际上并不存在。

假设我有一个名为的/path/foo.bar文件foo.bar.gzURI 映射到的文件夹中的文件/path,我如何才能让 Apache 提供其内容/path/foo.bar但又AddEncoding x-gzip ...应用于(不存在的)文件?

重写部分看起来很容易,但问题是如何将编码应用于不存在的项目。只要客户端支持编码,反之亦然。

唯一的解决方案真的是即时执行此操作的脚本吗?


我知道,mod_deflate而且mod_gzip不是我正在寻找的东西 - 至少不是单独寻找。特别是我需要一个真正的 GZIP 文件,而不仅仅是压缩的流。

现在我正考虑使用 mod_ext_filter,但无法弥合将(不存在的)的名称重写file.gzfileLocationMatch将 重写为 之间的差距。这是我所拥有的。

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 文件,但我想在没有缓存的情况下即时执行此操作(这是一个测试场景)。

答案1

好吧,很抱歉在提供悬赏后这么快就回答了自己的问题,但我终于找到了如何实现我想要的答案。我对问题的最后一次编辑很接近,但还不够接近。

事实证明,我可以滥用这个事实,mod_rewrite让我设置重写路径的 MIME 类型(T=)以便应用我的过滤器(使用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>

答案2

mod_gzip 应该可以帮助你

http://sourceforge.net/projects/mod-gzip/

以下是一些示例配置 http://schroepl.net/projekte/mod_gzip/config.htm

相关内容