Der Alexander: .htaccess: GZIP nach Accept-Encoding

Hallo,

ich suche nach einer Möglichkeit, in der .htaccess auf einem Apache-Webserver dem Browser GZIP-komprimierte Dateien auszuliefern, sofern der (Browser) das in einem Accept-Encoding angibt.
Also sinngemäß so etwa:

<If Accept-Encoding: gzip> # diese Anweisung für Apache verständlich machen
AddOutputFilter DEFLATE htm

Ich möchte nicht, daß das per PHP in jeder Datei realisiert wird und auch nicht von jeder betroffenen Datei eine GZIP-komprimierte Version anfertigen und auf dem Server ablegen.
Gibt es da eine Möglichkeit?

Grüße

  1. Hallo Alexander,

    ich suche nach einer Möglichkeit, in der .htaccess auf einem Apache-Webserver dem Browser GZIP-komprimierte Dateien auszuliefern, sofern der (Browser) das in einem Accept-Encoding angibt.
    Also sinngemäß so etwa:

    <If Accept-Encoding: gzip> # diese Anweisung für Apache verständlich machen
    AddOutputFilter DEFLATE htm

    Einfach nur: AddOutputFilter DEFLATE ...

    Der Deflate-OutputFilter checkt automatisch, ob Accept-Encoding: gzip gesetzt ist. Er kümmert sich auch automatisch um den korrekten Vary-Header. Du musst nichts mehr tun.

    Ich möchte nicht, daß das per PHP in jeder Datei realisiert wird und auch nicht von jeder betroffenen Datei eine GZIP-komprimierte Version anfertigen und auf dem Server ablegen.
    Gibt es da eine Möglichkeit?

    AddOutputFilterByType DEFLATE text/html text/plain

    Das sagt, dass wenn Content des Typs text/html (oder text/plain) generiert wird (egal ob statisch oder dynamisch), dann soll der Deflate-Filter genutzt werden.

    Viele Grüße,
    Christian

    --
    Mein "Weblog" [RSS]
    Using XSLT to create JSON output (Saxon-B 9.0 for Java)
    »I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
                -- Kommentar bei TDWTF
    1. Hallo Christian.

      Einfach nur: AddOutputFilter DEFLATE ...

      Der Deflate-OutputFilter checkt automatisch, ob Accept-Encoding: gzip gesetzt ist. Er kümmert sich auch automatisch um den korrekten Vary-Header. Du musst nichts mehr tun.

      Ach so, wenn damit automatisch überprüft wird, ob der Client das komprimierte kann, und nur falls ja, es ihm komprimiert geschickt wird, hat sich das mit einer zusätzlichen Abfrage ja erledigt.

      Danke.

      Es grüßt
      Alexander

      1. Hallo Alexander,

        Argh. Mir ist gerade wieder etwas eingefallen, ich hatte doch was bzgl. Output Filter im Hinterkopf:

        Wenn man mod_action verwendet dann ist das Verhalten vom Apache bezüglich Output Filter nicht sehr intuitiv (manche würden das auch als Bug bezeichnen), für Details siehe:

        http://marc.info/?l=apache-httpd-dev&m=119973112425481&w=2 (Leider habe ich keine Reaktion darauf bekommen...)

        Kurz zusammengefasst: Output Filter (egal welcher Art, das hat nichts mit DEFLATE zu tun) bei PHP als CGI/FastCGI funktionieren nicht bzw. nur wenn man sie für den PHP-CGI-Wrapper selbst aktiviert (was vmtl. unerwünscht ist). Bei PHP als Modul tritt das Problem nicht auf.

        Das heißt: Wenn's bei Dir nicht funktioniert (bei PHP-Seiten, statische Seiten sind kein Problem), dann kannst Du nicht wirklich etwas dagegen tun (außer es manuell in PHP machen)...

        Oder anders gesagt: Mein voriges Posting ist zwar prinzipiell richtig, es gibt aber Spezialfälle, wo OutputFilter überhaupt nicht wie erwartet funktionieren.

        Viele Grüße,
        Christian

        --
        Mein "Weblog" [RSS]
        Using XSLT to create JSON output (Saxon-B 9.0 for Java)
        »I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
                    -- Kommentar bei TDWTF
        1. Hallo Christian,
          frohes neues Jahr.

          Das heißt: Wenn's bei Dir nicht funktioniert (bei PHP-Seiten, statische Seiten sind kein Problem), dann kannst Du nicht wirklich etwas dagegen tun (außer es manuell in PHP machen)...

          Ich habe das meiste statisch. Leider funktioniert es trotzdem nicht, es wird immer unkomprimiert verschickt, auch wenn der Browser mitteilt, er könnte Komprimiertes empfangen. Ich denke, die Funktion ist am von mir genutzten Apache abgestellt - und darauf habe ich keinen Einfluß.

          Grüße und Dank vom
          Alexander

          1. Hallo,

            Ich habe das meiste statisch. Leider funktioniert es trotzdem nicht, es wird immer unkomprimiert verschickt, auch wenn der Browser mitteilt, er könnte Komprimiertes empfangen. Ich denke, die Funktion ist am von mir genutzten Apache abgestellt - und darauf habe ich keinen Einfluß.

            Ist denn mod_deflate im Apache geladen? Was sagt das Error-Log, falls Du darauf Zugriff haben solltest?

            Viele Grüße,
            Christian

            --
            Mein "Weblog" [RSS]
            Using XSLT to create JSON output (Saxon-B 9.0 for Java)
            »I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
                        -- Kommentar bei TDWTF
            1. Hallo.

              Ist denn mod_deflate im Apache geladen? Was sagt das Error-Log, falls Du darauf Zugriff haben solltest?

              Wie ich nun eruieren konnte, ist das Modul mod_deflate angeblich nicht geladen. So ein Ärger.
              Ins Error-Log kann ich leider nicht gucken.

              Grüße vom
              Alexander

              1. Hallo Alexander,

                Wie ich nun eruieren konnte, ist das Modul mod_deflate angeblich nicht geladen. So ein Ärger.

                Wenn es Dir nur um statische Seiten geht, Du aber Perl/CGI zur Verfügung hast, kannst Du Dir mal gzip_cnc ansehen. Das ist ein Perl-Script, das genau diese Funktionalität übernimmt - es wurde noch zu Zeiten des Apache 1.x entwickelt für Shared-Hosting-Umgebungen, bei denen mod_gzip (Vorgänger von mod_deflate) nicht zur Verfügung stand. Es sollte m.M.n. auch mit dem Apache 2.x funktionieren, ich hab' das aber nicht ausprobiert.

                Das konzept von gzip_cnc ist, dass jede statische Seite nicht vom Apache direkt ausgeliefert wird sondern durch das Perl-Script geleitet wird, das sich dann darum kümmert, die Seite (je nach Browser-Headern) komprimiert oder unkomprimiert auszuliefern.

                Viele Grüße,
                Christian

                --
                Mein "Weblog" [RSS]
                Using XSLT to create JSON output (Saxon-B 9.0 for Java)
                »I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
                            -- Kommentar bei TDWTF
                1. Hallo wieder.

                  Das ist ein Perl-Script

                  Uff, das klingt aber wirklich aufwendig. Mit Perl/CGI habe ich noch keinerlei Erfahrungen und weiß auch nicht, ob ich das auf dem Server überhaupt nutzen kann. Am liebsten sollte es ohne Perl/CGI sein, aber ich fürchte, das sieht schlecht aus.

                  Es grüßt
                  Alexander