为什么 Apache 不 gzip 带有参数的 css 或 js 文件?

9 gzip mod-deflate apache-2.2

启用 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>
Run Code Online (Sandbox Code Playgroud)

谢谢

mar*_*ton 5

嗯,有意思。我无法重现这个:

[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
Run Code Online (Sandbox Code Playgroud)

(删除了不相关的标题)

如上所述,FilesMatch匹配文件系统路径,而不是 URI。资源是不是文件系统上的压缩文件,还是动态生成的、代理的、重定向的或其他破坏 URI 到文件系统直接映射的资源?您可以尝试改用LocationMatch,如果您的应用程序的任何部分不是静态文件,这可能是更好的选择。

<IfModule mod_deflate.c>
  <LocationMatch "\.(css|js|x?html?|php)$">
     SetOutputFilter DEFLATE
  </LocationMatch>
</IfModule>
Run Code Online (Sandbox Code Playgroud)


Ben*_*ams 0

正则表达式末尾的 $ 将与 URL 的末尾匹配,因此如果文件扩展名后面有任何内容,它将不会匹配。您可以省略 $,但如果 URL 中的任何位置有“.css”等,它就会匹配。像下面的例子这样的东西可能会更安全。这应该匹配 URL 末尾的“.css”,或者“.css”后跟 ?、一些参数,然后是 URL 末尾。

   <IfModule mod_deflate.c>
        <FilesMatch "\.(css|js|x?html?|php)($|\?.*$)">
           SetOutputFilter DEFLATE
        </FilesMatch>
   </IfModule>
Run Code Online (Sandbox Code Playgroud)