Vra

Ek bedien alle inhoud deur apache met Content-Encoding: zip maar dit druk op die vlieg saam.'n Goeie hoeveelheid van my inhoud is statiese lêers op die skyf.Ek wil die lêers vooraf gzip eerder as om hulle saam te komprimeer elke keer as hulle versoek word.

Dit is iets wat ek glo, mod_gzip het outomaties in Apache 1.x gedoen, maar net die lêer met .gz langsaan.Dit is nie meer die geval met mod_deflate.

Was dit nuttig?

Oplossing

Hierdie funksie is misplaas in mod_gzip in elk geval. In Apache 2.x, jy dit doen met die inhoud onderhandeling . Spesifiek, moet jy MultiViews met die Options richtlijn en jou in staat stel nodig het om jou encoding tipes spesifiseer met die AddEncoding richtlijn .

Ander wenke

Om my eie vraag te beantwoord met die werklik eenvoudige lyn ek weg was in my confiuration:

Options FollowSymLinks MultiViews

Ek was ontbreek die opsie MultiViews. Dis daar in die Ubuntu verstek web server configuration, so moenie wees soos ek en gooi dit weg.

Ook het ek 'n vinnige Rake taak om al die lêers te compress.

namespace :static do
    desc "Gzip compress the static content so Apache doesn't need to do it on-the-fly."
    task :compress do
        puts "Gzipping js, html and css files."
        Dir.glob("#{RAILS_ROOT}/public/**/*.{js,html,css}") do |file|
            system "gzip -c -9 #{file} > #{file}.gz"
        end
    end
end

Ek is bevrees MultiViews sal nie werk soos verwag nie:die dokument sê Multiviews werk "as die bediener 'n versoek vir /some/dir/foo ontvang, as /some/dir MultiViews geaktiveer het, en /some/dir/foo nie bestaan ​​nie...", met ander woorde:as jy 'n lêer foo.js en foo.js.gz in dieselfde gids het, sal die aktivering van MultiViews nie veroorsaak dat die .gz-lêer gestuur word nie, selfs al word die AcceptEncoding gzip-kopskrif deur die blaaier versend (jy kan hierdie gedrag verifieer deur tydelik deaktiveer mod_deflate en monitering van die reaksie met bv.HTTPFox).

Ek is nie seker of daar 'n manier om dit met MultiViews is nie (miskien kan jy die oorspronklike lêer hernoem en dan 'n spesiale AddEncoding-instruksie byvoeg), maar ek glo jy kan 'n mod_rewrite-reël konstrueer om dit te hanteer.

Ek het 'n Apache 2 gebou van die bron, en ek het gevind dat ek moes die volgende in my httpd.conf lêer verander:

MultiViews Voeg by Options:

Options Indexes FollowSymLinks MultiViews

uncomment AddEncoding:

AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz

Kommentaar AddType:

#AddType application/x-compress .Z
#AddType application/x-gzip .gz .tgz

Dit is moontlik om vooraf saamgeperste lêers te bedien met behulp van mod_negotiation alhoewel dit 'n bietjie fyn is.Die primêre probleem is dit slegs versoeke vir lêers wat nie bestaan ​​nie, word onderhandel.So as foo.js en foo.js.gz beide bestaan, reaksies vir /foo.js sal altyd ongecomprimeerd wees (hoewel antwoorde vir /foo sal reg werk).

Die maklikste oplossing wat ek gevind het (van François Marie) is om ongecomprimeerde lêers te hernoem met 'n dubbele lêeruitbreiding, dus foo.js word ontplooi as foo.js.js so versoeke vir /foo.js onderhandel tussen foo.js.js (geen enkodering) en foo.js.gz (gzip-kodering).

Ek kombineer daardie truuk met die volgende konfigurasie:

Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz

# Send .tar.gz without Content-Encoding: gzip
<FilesMatch ".+\.tar\.gz$">
    RemoveEncoding .gz
    # Note:  Can use application/x-gzip for backwards-compatibility
    AddType application/gzip .gz
</FilesMatch>

ek 'n plasing geskryf wat die redenasie vir hierdie konfigurasie en 'n paar alternatiewe in detail bespreek.

mod_gzip saamgeperste inhoud op die vlieg as well. Jy kan pre-pers die lêers deur eintlik te meld by jou bediener, en doen dit uit dop.

cd /var/www/.../data/
for file in *; do
    gzip -c $file > $file.gz;
done;

Jy kan gebruik mod_cache om volmag plaaslike inhoud in die geheue of op skyf. Ek weet nie of dit sal werk soos verwag met mod_deflate.

Ek het 'n baie groot .json- lêers. Die meeste lesers is in hierdie situasie. Die voorskou antwoorde nie praat oor die teruggekeer "Content-tipe".

Ek julle wil hê dat die volgende versoek 'n pre-saamgeperste lêer met terugkeer "Content-Type: application / into" deursigtig, gebruik Multiview met ForceType

http://www.domain.com/(...)/bigfile.json
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip

1) lêers moet hernoem: "file.ext.ext"

2) Multiview werk baie goed saam met ForceType

In die lêerstelsel:

// Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json

In jou apache config:

<Directory (...)>
    AddEncoding gzip .gz
    Options +Multiviews
    <Files *.json.gz>
        ForceType application/json
    </Files>
</Directory>

Kort en eenvoudige:)

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top