启用 mod_deflate 后,apache 不会压缩某些 CSS 和 JS 文件。在 YSlow 中,这些文件看起来像这样“[domain.name]/aggregator.css?...”或“[domain.name]/misc/jquery.js?...”。没有“?”的其他 CSS 和 JS 会被压缩。请解释一下如何让 apache 也压缩这些文件。
我在 .htaccess 文件中添加了以下行
<IfModule mod_deflate.c>
<FilesMatch "\.(css|js|x?html?|php)$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>
谢谢
答案1
嗯,很有趣。我无法重现这一点:
[root@dev ~]# cat /etc/httpd/conf.d/test.conf
<FilesMatch "\.txt$">
SetOutputFilter DEFLATE
Header set X-Ping "Pong"
</FilesMatch>
[root@dev ~]# GET -SedH 'Accept-Encoding: gzip, deflate' 'http://localhost/test.txt'
GET http://localhost/test.txt --> 200 OK
Content-Encoding: gzip
Content-Length: 2449
X-Ping: Pong
[root@dev ~]# GET -SedH 'Accept-Encoding: gzip, deflate' 'http://localhost/test.txt?foo'
GET http://localhost/test.txt?foo --> 200 OK
Content-Encoding: gzip
Content-Length: 2449
X-Ping: Pong
(删除了不相关的标题)
如上所述,FilesMatch
匹配文件系统路径,而不是 URI。未被压缩的资源是文件系统上的文件,还是动态生成的、代理的、重定向的或其他破坏直接 URI 到文件系统映射的东西?您可以尝试使用位置匹配相反,如果您的应用程序的任何部分不是静态文件,这可能是更好的选择。
<IfModule mod_deflate.c>
<LocationMatch "\.(css|js|x?html?|php)$">
SetOutputFilter DEFLATE
</LocationMatch>
</IfModule>
答案2
正则表达式末尾的 $ 将匹配 URL 的末尾,因此如果文件扩展名后面有任何内容,则不会匹配。您可以省略 $,但如果 URL 中的任何地方有“.css”等,则它会匹配。类似下面的示例可能更安全。这应该匹配 URL 末尾的“.css”,或者“.css”后跟 ?、一些参数,然后是 URL 的末尾。
<IfModule mod_deflate.c>
<FilesMatch "\.(css|js|x?html?|php)($|\?.*$)">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>