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


8

启用了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>

谢谢

Answers:


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

(不相关的标题已删除)

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

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

感谢Mark的回复。您的解决方案似乎正在工作。

是否需要启用某些功能才能使LocationMatch运行?我尝试使用此解决方案,它会导致内部错误,但FileMatch可以工作...
Paul Sheldrake

不,它们都是服务器核心的一部分。使用您的配置代码段和错误消息打开另一个问题,我们将进行调查。
markdrayton

1
标题集+1 X-Ping“ Pong”的+1
Eddie B

会缓存响应,还是会在每个后续请求中gzip压缩到相同的js / css文件?
阿米特·帕特

0

正则表达式末尾的$将与URL的末尾匹配,因此,如果文件扩展名后面有任何内容,它将不匹配。您可以省略$,但是如果URL中的任何位置都有“ .css”等,它将与之匹配。类似于下面的示例可能更安全。该名称应与URL末尾的“ .css”匹配,或与“ .css”,后跟?,某些参数以及URL末尾的匹配。

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

1
我认为那是不对的。FilesMatch匹配文件系统文件名,而不是URI。LocationMatch与URI匹配(但即使匹配仅查看URI,也不查询字符串)。
markdrayton
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.