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

8

Alguns arquivos CSS e JS não são compactados pelo apache com o mod_deflate ativado. Esses arquivos são parecidos com "" [domain.name] /aggregator.css? ... "ou" [domain.name] /misc/jquery.js? ... "no YSlow. Os outros CSS e JS sem o "?" fica comprimido. Por favor, explique-me como faço para o apache comprimir esses arquivos também.

Adicionei a seguinte linha no arquivo .htaccess

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

obrigado

raio
fonte

Respostas:

5

Hum, 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, FilesMatchcorresponde aos caminhos do sistema de arquivos , não aos URIs. Os recursos que não estão sendo arquivos compactados no sistema de arquivos ou são gerados dinamicamente, ou com proxy ou redirecionados ou algo mais que interrompe o mapeamento direto de URI para sistema de arquivos? Você pode tentar usar o LocationMatch , o que provavelmente é uma aposta melhor de qualquer maneira, se alguma parte do seu aplicativo não for arquivos estáticos.

<IfModule mod_deflate.c>
  <LocationMatch "\.(css|js|x?html?|php)$">
     SetOutputFilter DEFLATE
  </LocationMatch>
</IfModule>
markdrayton
fonte
Obrigado Mark pela resposta. Sua solução parece estar funcionando.
É necessário ativar algo para que o LocationMatch funcione? Eu tentei usar esta solução e que provoca um erro interno, mas FileMatch funciona ...
Paul Sheldrake
Não, ambos fazem parte do núcleo do servidor. Abra outra pergunta com seu snippet de configuração e a mensagem de erro e daremos uma olhada.
markdrayton
11
+1 para o cabeçalho definido X-Ping "Pong"
Eddie B
este cache responde ou irá compactar em cada solicitação subsequente o mesmo arquivo js / css?
Amit Patel
0

O $ no final de 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ê pode omitir o $, mas ele corresponderia se houvesse um ".css" etc. em qualquer lugar 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>
Ben Williams
fonte
11
Eu não acho isso correto. FilesMatch corresponde a um nome de arquivo do sistema de arquivos, não a um URI. LocationMatch corresponde a URIs (mas mesmo que apenas olhe para o URI, não para a string de consulta).
markdrayton