Apache: Senden Sie vorgefertigte gzip'ed-Dateien

8

Ich möchte, dass Apache statische Dateien über das Kabel sendet, aber auch, dass Apache sie nicht immer und immer wieder komprimiert. Also dachte ich, wenn es nicht möglich wäre, eine .gz-Datei zu liefern, wenn sie existiert. Diese Einstellung:

Dateistruktur:

static/
|
|--- style.css
|
\--- style.css.gz

Und das Folgende in einem .htaccess:

mod_rewrite Regel:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz [L]

Und diese Einstellung:

AddEncoding x-gzip .gz

Tatsächlich funktioniert dies insofern, als die .gz-Datei anstelle der .css-Datei gesendet wird, wenn die Anforderung an gesendet wird /static/style.css. Das Problem ist nur, dass die Datei als "application / x-gzip" und nicht als "text / css" geliefert wird. Die Verwendung des T-Flags von mod_rewrite ändert daran nichts. Auch nicht explizit

AddType text/css .css

Hat jemand eine Idee, wie ich das gewünschte Verhalten erreichen könnte? Oder ist es aus irgendeinem Grund unnötig, mit dem ich nicht gerechnet habe?

BEARBEITEN: Es gibt eine zusätzliche Schwierigkeit: Senden der Originaldatei an Clients ohne gzip-Unterstützung. Hat jemand eine Idee, wie das funktionieren könnte?

Boldewyn
quelle
Ich bin erstaunt, dass dies nicht viel offensichtlicher ist, da es verrückt erscheint, einen Webserver zu haben, der dies nicht tut. Ich denke, IIS hat ein System zum Zwischenspeichern von komprimierten Kopien statischer Dateien beim ersten Zugriff. mod_deflate erwähnt eine solche Funktion nicht.
rjmunro
apaches mod_deflate-Dokumente haben jetzt ein eigenes Beispiel: httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompressed
cweiske

Antworten:

5

Eine Lösung zum Senden der richtigen Version an Browser, die gzip nicht akzeptieren, wäre wie folgt:

RewriteCond %{HTTP:Accept-Encoding} !gzip
...your rules here...

Es gibt auch eine andere Möglichkeit, den Typ zu ändern, nämlich:

<FilesMatch .*\.css.gz>
    ForceType text/css
</FilesMatch>

<FilesMatch .*\.js.gz>
    ForceType text/javascript
</FilesMatch>

HTH.

Sam Halicke
quelle
Cool, danke! Gibt es Dokumente für das% {HTTP: ...} Ding? Ich habe keine Erwähnung im RewriteCond-Abschnitt von Apache 2.2 gesehen. Das FilesMatch war eine andere Idee, die ich hatte, aber ich fand es ausführlicher. Da beide Regeln die Regexp-Engine starten müssen, sollte es keinen wirklichen Unterschied geben.
Boldewyn
OK, habe die Dokumente gefunden. httpd.apache.org/docs/2.2/mod/mod_rewrite.html Ich habe gerade den interessanten Teil übersprungen.
Boldewyn
Dies ist kein großes Problem, aber wenn jemand diese Konfiguration liest und die .css.gz-Datei manuell abruft, erhält er den Text / CSS, wenn er den Typ application / x-gzip erhalten soll.
rjmunro
Warum zum ! vor gzip in der Zeile Accept-Encoding? Sicher ist das das Gegenteil von dem, was Sie brauchen?
rjmunro
Ich dachte das gleiche, es Sinn macht , die haben , RewriteCondpassen nur , wenn der Client tut gzip - Codierung akzeptieren.
David Z
3

Ah, anscheinend habe ich eine Lösung gefunden: Das T-Flag funktioniert nicht, wenn es auf dieselbe Regel gesetzt ist, aber es funktioniert sicher, wenn Sie eine eigene Regel ausgeben:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz

RewriteRule \.css\.gz$ - [T=text/css]
RewriteRule \.js\.gz$ - [T=text/javascript]

Trotzdem würde ich gerne die Lösungen und Meinungen anderer hören.

Boldewyn
quelle