使用Apache(2.2及更高版本),我如何实现以下function。 当使用GZip编码( 不是简单的Deflate)输出某个文件时,我想要使用它的名字加上扩展名.gz ,其中的.gz版本在磁盘上并不存在。
假设我有一个名为/path/foo.bar的文件,并且在URI /path映射到的文件夹中没有文件foo.bar.gz ,我怎样才能让Apache服务于/path/foo.bar的内容,但是使用AddEncoding x-gzip ...应用于(不存在的)文件?
重写部分似乎很容易,但问题是如何将编码应用到不存在的项目。 另一种方式似乎也很简单,只要客户端支持编码。
唯一的解决scheme真的是一个脚本,在飞行中做到这一点?
我知道mod_deflate和mod_gzip ,这不是我正在寻找 – 至less不是一个人。 特别是我需要一个实际的GZIP文件,而不仅仅是一个放气的stream。
现在我正在考虑使用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文件,但是我想在没有caching的情况下执行此操作(这是一个testing场景)。
好吧,很抱歉在提供奖励后不久回答我自己的回答,但是我终于find了如何完成我想要的。 我对我的问题的最后编辑是接近,但不够接近。
原来我可以滥用这个事实,即mod_rewrite允许我设置重写path( T= )的MIMEtypes,以便使用AddOutputFilterByType指令应用我的filter(使用mod_ext_filter ),如下所示:
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扩展名时才有条件地应用filter,但是从不请求以(现有)名称进入。
我所做的只是发明自己的MIMEtypes。
由于200_success在他/她的评论中提出,我再一次调整了这个可读性,并依赖于一个环境variables(通过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>
mod_gzip应该能够帮助你
http://sourceforge.net/projects/mod-gzip/
这里有一些示例configurationhttp://schroepl.net/projekte/mod_gzip/config.htm