Beste Möglichkeit, HTML, CSS & JS mit mod_deflate und mod_gzip zu komprimieren

8

Ich habe einige Websites auf einem freigegebenen Host, auf dem Apache 2 ausgeführt wird. Ich möchte den HTML-, CSS- und JavaScript-Code komprimieren, der an den Browser geliefert wird. Der Host hat mod_deflate und mod_gzip deaktiviert, daher sind diese Optionen nicht verfügbar. Ich habe jedoch PHP 5 zur Verfügung, also könnte ich die gzip-Komponente davon verwenden.

Ich stelle derzeit Folgendes in meine .htaccess-Datei:

  

php_value output_handler ob_gzhandler

Dies komprimiert jedoch nur den HTML-Code und lässt CSS und JS aus.

Gibt es eine zuverlässige Möglichkeit, die Ausgabe von CSS und JS transparent zu komprimieren, ohne jede Seite ändern zu müssen? Ich habe Google durchsucht und eine Reihe von Lösungen vorgestellt, aber ich muss noch einen zur Arbeit bringen. Wenn jemand eine Lösung vorschlagen könnte, von der er weiß, dass sie funktioniert, würde das sehr dankbar sein.

Beachten Sie Methode 2 in sieht wie eine gute Lösung aus, aber ich konnte es nicht zum Laufen bringen. Hat jemand anderes diese Methode erfolgreich angewendet?

    
Charles Roper 07.09.2008, 16:23
quelle

5 Antworten

7

Tut mir leid wegen der Verzögerung - es ist eine arbeitsreiche Woche für mich.

Annahmen:

  • .htaccess befindet sich in der gleichen Datei wie compress.php
  • Statische Dateien, die komprimiert werden sollen, befinden sich im static Unterverzeichnis

Ich habe meine Lösung damit begonnen, die folgenden Anweisungen in .htaccess:

zu setzen %Vor%

Es ist erforderlich, dass Ihr Provider Ihnen erlaubt, mod_rewrite Optionen in .htaccess Dateien zu überschreiben. Dann kann die Datei compress.php selbst so aussehen:

%Vor%

Sie sollten der switch-Anweisung natürlich weitere Mime-Typen hinzufügen. Ich wollte die Lösung nicht von der pecl fileinfo Erweiterung oder anderen magischen MIME-Typ-Erkennungsbibliotheken abhängig machen - das ist der einfachste Ansatz.

Wie bei der Sicherung des Skripts - ich führe eine Übersetzung in einen echten Pfad im Dateisystem durch, damit keine gehackten '../../../etc/passwd' oder andere Shellscript-Dateipfade durchlaufen werden.

Das ist das

%Vor%

Schnipsel. Obwohl ich ziemlich sicher bin, dass die meisten Pfade, die sich in einer anderen Hierarchie als $ basedir befinden, vom Apache behandelt werden, bevor sie das Skript überhaupt erreichen.

Ich überprüfe auch, ob der resultierende Pfad innerhalb der Verzeichnisstruktur des Skripts ist. Fügen Sie die Header für die Cache-Kontrolle hinzu, wie von pilif vorgeschlagen, und Sie sollten eine funktionierende Lösung für Ihr Problem haben.

    
macbirdie 10.09.2008 19:26
quelle
4

Was ich mache:

  • Ich platziere Skripte in einem js und Stylesheets in einem css Verzeichnis.
  • In der Apache-Konfiguration füge ich Anweisungen wie folgt hinzu:

    %Vor%
  • gzip-js.php im Verzeichnis js sieht folgendermaßen aus:

    %Vor%
  • ... und gzip-cs.php im Verzeichnis css sehen folgendermaßen aus:

    %Vor%

Dies ist vielleicht nicht die eleganteste Lösung, aber es ist sicherlich eine einfache, die einige Änderungen erfordert und gut funktioniert.

    
Sören Kuklau 07.09.2008 17:14
quelle
1

Was auch immer Sie tun, seien Sie vorsichtig beim Caching auf der Client-Seite:

Browser tun alle möglichen Tricks, um die Bandbreite zu minimieren und es gibt viele Möglichkeiten im HTTP-Protokoll, dies zu tun, die alle mit Apache behandelt werden - wenn Sie nur eine lokale Datei bereitstellen.

Wenn nicht, dann liegt es in Ihrer Verantwortung .

Sehen Sie sich zumindest die ETag- und If-Modified-Since-Mechanismen an, die von allen aktuellen Browsern unterstützt werden und die stabilste Möglichkeit zu sein scheinen, den Server nach aktualisierten Inhalten abzufragen.

Eine Möglichkeit, eine CSS-Datei für Browser bereitzustellen, die den If-Modified-Since-Header verwenden, ist etwa so (die leeren Header, um alle nicht-caching-Header zu deaktivieren, die PHP standardmäßig sendet):

%Vor%

Der Code verwendet den "if-modified-since-header", den der Browser sendet, um zu prüfen, ob sich die tatsächliche Datei auf dem Server seit dem Datum geändert hat, das der Browser angegeben hat. Wenn dies der Fall ist, wird die Datei gesendet, andernfalls wird 304 Not Modified zurückgegeben und der Browser muss nicht den gesamten Inhalt erneut herunterladen (und wenn er intelligent genug ist, hält er das geparste CSS auch im Speicher).

>

Es gibt einen weiteren Mechanismus, bei dem der Server einen eindeutigen ETag-Header für jedes Stück Inhalt sendet. Der Client sendet das mit einem If-None-Match-Header zurück, der es dem Server ermöglicht, nicht nur über das Datum der letzten Änderung, sondern auch über den Inhalt selbst zu entscheiden.

Das macht den Code allerdings komplizierter, also habe ich ihn weggelassen. FF, IE und Opera (wahrscheinlich auch Safari) senden alle den If-Modified-Since-Header, wenn sie Inhalt mit einem Last-Modified-Header erhalten, also funktioniert das gut.

Bedenken Sie auch, dass bestimmte Versionen des IE (oder der JScript-Runtime, die er verwendet) immer noch Probleme mit GZIP-übertragenen Inhalten haben.

Oh. Und ich weiß, dass das nicht Teil der Frage ist, aber auch Acrobat in einigen Versionen. Ich habe Fälle und Fälle von weißen Bildschirmen gehabt, während ich PDFs mit gzip Übertragungsverschlüsselung gedient habe.

    
pilif 07.09.2008 20:34
quelle
1

Anstatt im laufenden Betrieb zu entpacken, wenn Benutzer die CSS- und JavaScript-Dateien anfordern, können Sie sie im Voraus herunterladen. Solange Apache ihnen die richtigen Header anbietet, bist du golden.

Unter Mac OS X können Sie z. B. einfach eine Datei in der Befehlszeile zippen:

%Vor%

Vielleicht ist das nicht der Workflow, der für Sie funktioniert.

    
Paul D. Waite 20.12.2009 22:22
quelle
1

Sie können Ihr Glück mit mod_rewrite versuchen.

Erstellen Sie ein Skript, das einen lokalen statischen Dateinamen als Eingabe verwendet, z. $_SERVER['QUERY_STRING'] und gibt es in komprimierter Form aus. Viele Provider erlauben es nicht, mod_rewrite mit .htaccess -Dateien zu konfigurieren oder sie vollständig zu deaktivieren.

Wenn Sie rewrite noch nicht verwendet haben, empfehle ich Ihnen einen guten Anfängerleitfaden, wie zB dieser . Auf diese Weise können Sie den Apache veranlassen, alle Anfragen für eine statische Datei an ein PHP-Skript umzuleiten. style.css wird zum Beispiel zu compress.php? style.css umgeleitet.

Wie immer seid extrem vorsichtig bei der Eingabe, die du akzeptierst, oder du hast einen XSS Exploit auf deinen Händen!

    
macbirdie 07.09.2008 17:01
quelle

Tags und Links