Por que o Apache não gzip arquivos css ou js que possuem parâmetros?

8

Alguns CSS & Arquivos JS não são compactados pelo apache com o mod_deflate ativado. Esses arquivos se parecem com "[domain.name] /aggregator.css? ..." ou "[domain.name] /misc/jquery.js? ..." no YSlow. O outro CSS & JS sem o "?" fica comprimido. Por favor, me explique como faço para o apache compactar esses arquivos também.

Eu adicionei a seguinte linha no arquivo .htaccess

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

Obrigado

    
por radius 10.09.2009 / 11:24

2 respostas

5

Hrm, interessante. Não consigo reproduzir isso:

[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

(cabeçalhos não relacionados removidos)

Como mencionado acima, FilesMatch corresponde a caminhos do sistema de arquivos , não a URIs. Os recursos que não estão sendo compactados no sistema de arquivos ou são gerados na hora, ou intermediados por proxy, ou redirecionados ou qualquer outra coisa que interrompa o mapeamento direto do URI para o sistema de arquivos? Você poderia tentar usar o LocationMatch , que provavelmente é uma aposta melhor, de qualquer forma, se qualquer parte do seu aplicativo não é um arquivo estático.

<IfModule mod_deflate.c>
  <LocationMatch "\.(css|js|x?html?|php)$">
     SetOutputFilter DEFLATE
  </LocationMatch>
</IfModule>
    
por 10.09.2009 / 14:17
0

O $ no final da sua expressão regular corresponderá ao final do URL, portanto, se houver algo após a extensão do arquivo, ele não corresponderá. Você poderia omitir o $, mas ele corresponderia se houvesse um ".css" etc. em qualquer parte do URL. Algo como o exemplo abaixo pode ser mais seguro. Isso deve corresponder a ".css" no final da URL ou ".css" seguido por?, Alguns parâmetros e, em seguida, ao final da URL.

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