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


8

Некоторые файлы 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>

Спасибо

Ответы:


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>

Спасибо Марк за ответ. Ваше решение, кажется, работает.

Что-то должно быть включено, чтобы LocationMatch работал? Я попытался использовать это решение, и оно вызывает внутреннюю ошибку, но FileMatch работает ...
Пол Шелдрейк

Нет, они оба являются частью серверного ядра. Откройте другой вопрос с помощью своего фрагмента конфигурации и сообщения об ошибке, и мы посмотрим.
Маркдрайтон

1
+1 за набор заголовков X-Ping «Понг»
Эдди Б

это ответ кеша или он будет gzip при каждом последующем запросе к одному и тому же файлу js / css?
amit patel

0

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

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

1
Я не думаю, что это правильно. FilesMatch соответствует имени файла файловой системы, а не URI. LocationMatch совпадает с URI (но даже это смотрит только на URI, а не на строку запроса).
Markdrayton
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.