Apache:发送预压缩的gzip文件


8

我希望Apache通过网络发送gzip'ed的静态文件,但也希望Apache不能总是一遍又一遍地gzip化它们。因此,我认为如果存在.gz文件,是否无法提供该文件。此设置:

文件结构:

static/
|
|--- style.css
|
\--- style.css.gz

.htaccess中的以下内容:

mod_rewrite规则:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz [L]

而这个设置:

AddEncoding x-gzip .gz

实际上,如果请求转到,则在发送.gz文件而不是.css的情况下,此方法有效/static/style.css。唯一的问题是,文件以“ application / x-gzip”而不是“ text / css”的形式提供。使用mod_rewrite的T标志不会改变它。明确的也没有

AddType text/css .css

有谁知道我如何实现期望的行为?还是出于某种我没想到的原因而不必要?

编辑:还有一个额外的困难:将原始文件发送给不带gzip支持的客户端。有谁知道这如何工作?


我感到惊讶的是,这种情况并没有更加明显,因为拥有不执行此操作的Web服务器似乎很疯狂。我认为IIS有一个系统可以在首次访问时缓存静态文件的压缩副本。mod_deflate没有提到这样的功能。
rjmunro

Apache的mod_deflate模块文档现在有自己的例子:httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompressed
cweiske

Answers:


5

一种向不接受gzip的浏览器发送正确版本的解决方案可以是:

RewriteCond %{HTTP:Accept-Encoding} !gzip
...your rules here...

另外,还有另一种更改类型的方法,即:

<FilesMatch .*\.css.gz>
    ForceType text/css
</FilesMatch>

<FilesMatch .*\.js.gz>
    ForceType text/javascript
</FilesMatch>

HTH。


太好了,谢谢!是否有%{HTTP:...}文档?我没有在Apache 2.2的RewriteCond部分中提及它。FilesMatch是我的另一个想法,但我认为它比较冗长。由于这两个规则都需要启动正则表达式引擎,因此应该没有真正的区别。
Boldewyn

确定,找到了文档。httpd.apache.org/docs/2.2/mod/mod_rewrite.html我只是跳过了有趣的部分。
Boldewyn

这不是一个大问题,但是在读取该配置时,如果有人手动获取.css.gz文件,则当他们应该获得application / x-gzip类型时,他们将获得text / css。
rjmunro

为何 !在gzip之前在Accept-Encoding行上?当然这与您需要的相反吗?
rjmunro

我的想法一样,是有意义的有RewriteCond当客户端只匹配接受gzip编码。
David Z

3

嗯,看来我找到了一个解决方案:如果将T标志设置为相同的规则,则T标志将不起作用,但是,如果您使用它自己的规则,则它肯定会起作用:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz

RewriteRule \.css\.gz$ - [T=text/css]
RewriteRule \.js\.gz$ - [T=text/javascript]

我仍然想听听别人的解决方案和意见。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.