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

有些CSS和JS文件不是由Apache启用mod_deflate压缩的。 这个文件在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> 

谢谢

有趣的。 我不能重现这一点:

 [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匹配文件系统path,而不是URI。 文件系统上没有被压缩文件的资源,或者它们是被dynamic生成的,或者被代理的,或者是redirect的,或者其他破坏直接URI到文件系统映射的东西的资源? 你可以尝试使用LocationMatch ,如果你的应用程序的任何部分不是静态文件,这可能是一个更好的select。

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

正则expression式结尾处的$将匹配URL的末尾,所以如果文件扩展名后有任何内容,则不匹配。 你可以省略$,但是如果URL中的任何地方出现“.css”等,就会匹配。 类似下面的例子可能会更安全。 这应该与URL末尾的“.css”匹配,或者匹配“.css”后跟?,一些参数,然后是URL的末尾。

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