Warum gzip Apache keine CSS- oder JS-Dateien mit Parametern?


8

Einige CSS- und JS-Dateien werden bei aktiviertem mod_deflate nicht von Apache komprimiert. Diese Datei sieht in YSlow wie folgt aus: "[domain.name] /aggregator.css? ..." oder "[domain.name] /misc/jquery.js? ...". Das andere CSS & JS ohne das "?" wird komprimiert. Erklären Sie mir bitte, wie ich Apache dazu bringe, diese Dateien auch zu komprimieren.

Ich habe die folgende Zeile in die .htaccess-Datei eingefügt

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

Vielen Dank

Antworten:


5

Hm, interessant. Ich kann das nicht reproduzieren:

[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

(nicht verwandte Header entfernt)

Wie oben erwähnt, FilesMatchstimmt mit Dateisystempfaden überein , nicht mit URIs. Sind die Ressourcen, die keine komprimierten Dateien im Dateisystem sind, oder werden sie im laufenden Betrieb generiert oder per Proxy oder umgeleitet oder etwas anderes, das die direkte Zuordnung von URI zu Dateisystem unterbricht? Sie können stattdessen versuchen, LocationMatch zu verwenden. Dies ist wahrscheinlich ohnehin eine bessere Wahl, wenn ein Teil Ihrer App keine statischen Dateien enthält.

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

Danke Mark für die Antwort. Ihre Lösung scheint zu funktionieren.

Muss etwas aktiviert sein, damit LocationMatch funktioniert? Ich habe versucht, diese Lösung zu verwenden, und es verursacht einen internen Fehler, aber FileMatch funktioniert ...
Paul Sheldrake

Nein, beide sind Teil des Serverkerns. Öffnen Sie eine weitere Frage mit Ihrem Konfigurations-Snippet und der Fehlermeldung, und wir werden einen Blick darauf werfen.
Markdrayton

1
+1 für Header Set X-Ping "Pong"
Eddie B

Gibt diese Cache-Antwort oder wird sie bei jeder nachfolgenden Anforderung an dieselbe js / css-Datei gzip?
Amit Patel

0

Das $ am Ende Ihres regulären Ausdrucks stimmt mit dem Ende der URL überein. Wenn also nach der Dateierweiterung etwas steht, stimmt es nicht überein. Sie könnten das $ weglassen, aber dann würde es übereinstimmen, wenn irgendwo in der URL eine ".css" usw. vorhanden wäre. So etwas wie das folgende Beispiel könnte sicherer sein. Dies sollte entweder mit ".css" am Ende der URL oder mit ".css" gefolgt von?, Einigen Parametern und dem Ende der URL übereinstimmen.

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

1
Ich denke nicht, dass das richtig ist. FilesMatch entspricht einem Dateisystem-Dateinamen, nicht einem URI. LocationMatch stimmt mit URIs überein (aber selbst das betrachtet nur den URI, nicht die Abfragezeichenfolge).
Markdrayton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.