Назад | Перейти на главную страницу

Почему Apache не архивирует файлы css или js с параметрами?

Некоторые файлы CSS и JS не сжимаются apache с включенным mod_deflate. Эти файлы выглядят так: "[domain.name] /aggregator.css? ..." или "[domain.name] /misc/jquery.js? ..." в YSlow. Другой 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 Спички файловая система пути, а не URI. Являются ли ресурсы, которые не являются сжатыми файлами в файловой системе, или они генерируются на лету, или проксируются, или перенаправляются, или что-то еще, что нарушает прямое сопоставление URI-файловой системы? Вы можете попробовать использовать LocationMatch вместо этого, что, вероятно, в любом случае лучше, если какая-либо часть вашего приложения не является статическими файлами.

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

Символ $ в конце вашего регулярного выражения будет соответствовать концу URL-адреса, поэтому, если после расширения файла есть что-то, оно не будет совпадать. Вы можете опустить $, но тогда он будет соответствовать, если в URL-адресе есть «.css» и т. Д. Что-то вроде приведенного ниже примера может быть безопаснее. Это должно соответствовать либо «.css» в конце URL-адреса, либо «.css», за которым следует?, Некоторые параметры, а затем конец URL-адреса.

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