Pourquoi Apache ne compile pas les fichiers css ou js qui ont des paramètres?

8

Certains fichiers CSS et JS ne sont pas compressés par apache avec mod_deflate activé. Ces fichiers ressemblent à ceci "[nom.domaine] /aggregator.css? ..." ou "[nom.domaine] /misc/jquery.js? ..." dans YSlow. Les autres CSS et JS sans le "?" est compressé. Veuillez m'expliquer comment faire pour que Apache comprime également ces fichiers.

J'ai ajouté la ligne suivante sur le fichier .htaccess

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

Merci

rayon
la source

Réponses:

5

Hrm, intéressant. Je ne peux pas reproduire ceci:

[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

(en-têtes non liés supprimés)

Comme mentionné ci-dessus, FilesMatchcorrespond aux chemins du système de fichiers , pas aux URI. Les ressources qui ne sont pas des fichiers compressés sur le système de fichiers ou sont-elles générées à la volée, ou mandatées, ou redirigées ou autre chose qui rompt le mappage direct URI-système de fichiers? Vous pouvez essayer d'utiliser LocationMatch à la place, ce qui est probablement un meilleur pari de toute façon si une partie de votre application n'est pas un fichier statique.

<IfModule mod_deflate.c>
  <LocationMatch "\.(css|js|x?html?|php)$">
     SetOutputFilter DEFLATE
  </LocationMatch>
</IfModule>
Markdrayton
la source
Merci Mark pour la réponse. Votre solution semble fonctionner.
Faut-il activer quelque chose pour que LocationMatch fonctionne? J'ai essayé d'utiliser cette solution et cela provoque une erreur interne mais FileMatch fonctionne ...
Paul Sheldrake
Non, ils font tous deux partie du cœur du serveur. Ouvrez une autre question avec votre extrait de configuration et le message d'erreur et nous allons y jeter un œil.
markdrayton
1
+1 pour le jeu d'en-tête X-Ping "Pong"
Eddie B
cette réponse cache-t-elle ou gzip dans chaque requête suivante vers le même fichier js / css?
amit patel
0

Le $ à la fin de votre expression régulière correspondra à la fin de l'URL, donc s'il y a quelque chose après l'extension de fichier, il ne correspondra pas. Vous pouvez omettre le $ mais il correspondrait s'il y avait un ".css" etc. n'importe où dans l'URL. Quelque chose comme l'exemple ci-dessous pourrait être plus sûr. Cela doit correspondre soit à ".css" à la fin de l'URL, soit à ".css" suivi de?, De certains paramètres, puis de la fin de l'URL.

   <IfModule mod_deflate.c>
        <FilesMatch "\.(css|js|x?html?|php)($|\?.*$)">
           SetOutputFilter DEFLATE
        </FilesMatch>
   </IfModule>
Ben Williams
la source
1
Je ne pense pas que ce soit correct. FilesMatch correspond à un nom de fichier du système de fichiers, pas à un URI. LocationMatch correspond aux URI (mais même cela ne regarde que l'URI, pas la chaîne de requête).
markdrayton