Apache: invia file gzip preconfezionati


8

Voglio che Apache invii i file statici compressi tramite gzip sul cavo, ma voglio anche che Apache non li comprenda sempre ripetutamente. Quindi ho pensato se non fosse possibile consegnare un file .gz se esiste. Questo set-up:

Struttura del file:

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

E quanto segue in un .htaccess:

regola mod_rewrite:

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

E questa impostazione:

AddEncoding x-gzip .gz

In realtà, questo funziona nella misura in cui viene inviato il file .gz invece del .css, se la richiesta va a /static/style.css. Il problema è solo che il file viene recapitato come "application / x-gzip" e non come "text / css". L'uso del flag T di mod_rewrite non cambia questo. Nemmeno un esplicito

AddType text/css .css

Qualcuno ha un'idea, come potrei ottenere il comportamento desiderato? O non è necessario per qualche motivo che non ho calcolato?

EDIT: c'è un'ulteriore difficoltà: inviare il file originale ai client senza il supporto di gzip. Qualcuno ha idea di come potrebbe funzionare?


Sono sorpreso che questo non sia molto più ovvio, in quanto sembra folle avere un web server che non lo fa. Penso che IIS abbia un sistema per memorizzare nella cache le copie gzip di file statici al primo accesso. mod_deflate non menziona tale caratteristica.
rjmunro,

I documenti mod_deflate di apache hanno ora il loro esempio: httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompressed
cweiske

Risposte:


5

Una soluzione per inviare la versione corretta ai browser che non accettano gzip sarebbe qualcosa sulla falsariga di:

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

Inoltre, c'è un altro modo per cambiare il tipo, vale a dire:

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

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

HTH.


Figo, grazie! Ci sono documenti per la cosa% {HTTP: ...}? Non ho visto alcuna menzione nella sezione RewriteCond di Apache 2.2. Il FilesMatch era un'altra idea che avevo ma l'ho pensato più in dettaglio. Poiché entrambe le regole devono accendere il motore regexp, non dovrebbero esserci differenze reali.
Boldewyn,

OK, ho trovato i documenti. httpd.apache.org/docs/2.2/mod/mod_rewrite.html Ho appena saltato la parte interessante.
Boldewyn,

Questo non è un grosso problema, ma leggendo quella configurazione, se qualcuno prendesse manualmente il file .css.gz, otterrebbero il testo / css, quando dovrebbero ottenere il tipo application / x-gzip.
rjmunro,

Perché il ! prima di gzip sulla riga Accept-Encoding? Sicuramente è l'opposto di quello che ti serve?
rjmunro,

Stavo pensando la stessa cosa, ha senso avere l' RewriteCondunica gara in cui il cliente non accetti la codifica gzip.
David Z,

3

Ah, sembra che ho trovato una soluzione: il flag T non funziona se impostato sulla stessa regola, ma sicuramente funziona, se lo spendi una regola a parte:

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

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

Mi piacerebbe comunque ascoltare le soluzioni e le opinioni degli altri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.