mod_deflate htaccess enable content check apache http gzip mod-deflate content-encoding

apache - htaccess - gzip web



¿Cómo puedo precomprimir archivos con mod_deflate en Apache 2.x? (8)

Estoy sirviendo todo el contenido a través de apache con Content-Encoding: zip pero que se comprime sobre la marcha. Una buena cantidad de mi contenido son archivos estáticos en el disco. Quiero descomprimir los archivos de antemano en lugar de comprimirlos cada vez que se soliciten.

Esto es algo que, creo, mod_gzip hizo en Apache 1.x automáticamente, pero solo tenía el archivo con .gz al lado. Eso ya no es el caso con mod_deflate .


Es posible servir archivos mod_negotiation utilizando mod_negotiation aunque es un poco quisquilloso. La principal dificultad es que solo se negocian las solicitudes de archivos que no existen . Entonces, si foo.js y foo.js.gz existen, las respuestas para /foo.js siempre estarán sin comprimir (aunque las respuestas para /foo funcionarían correctamente).

La solución más fácil que he encontrado ( de François Marier ) es cambiar el nombre de los archivos sin comprimir con una extensión de archivo doble, por lo que foo.js se implementa como foo.js.js por lo que las solicitudes de / /foo.js negocian entre foo.js.js ( sin codificación) y foo.js.gz (codificación gzip).

Combino ese truco con la siguiente configuración:

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>

Escribí una publicación que analiza el razonamiento de esta configuración y algunas alternativas en detalle.



Me temo que MultiViews no funcionará como se esperaba: el documento dice que Multiviews funciona "si el servidor recibe una solicitud para / some / dir / foo, si / some / dir tiene MultiViews habilitado, y / some / dir / foo no existe. .. ", en otras palabras: si tiene un archivo foo.js y foo.js.gz en el mismo directorio, simplemente al activar MultiViews no se enviará el archivo .gz aunque el encabezado gzip de AcceptEncoding sea transmitido por el navegador (puede verificar este comportamiento desactivando temporalmente mod_deflate y supervisando la respuesta con, por ejemplo, HTTPFox).

No estoy seguro de si hay una forma de evitar esto con MultiViews (quizás pueda cambiar el nombre del archivo original y luego agregar una directiva especial AddEncoding), pero creo que puede construir una regla mod_rewrite para manejar esto.


Para responder mi propia pregunta con la línea realmente simple que me faltaba en mi confiuración:

Options FollowSymLinks MultiViews

Me faltaba la opción MultiViews. Está ahí en la configuración predeterminada del servidor web de Ubuntu, así que no seas como yo y déjalo.

También escribí una rápida tarea de Rake para comprimir todos los archivos.

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


Puede usar mod_cache para proxy de contenido local en la memoria o en el disco. No sé si funcionará como se esperaba con mod_deflate .


Tengo muchos archivos .json grandes. La mayoría de los lectores están en esta situación. Las respuestas de la vista previa no hablaban del "tipo de contenido" devuelto.

Si desea que la siguiente solicitud devuelva un archivo precomprimido con "Content-Type: application / json" de forma transparente, use Multiview con ForceType

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

1) los archivos deben renombrarse: "file.ext.ext"

2) Multiview funciona muy bien con ForceType

En el sistema de archivos:

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

En tu configuración de apache:

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

Corto y simple :)


Tengo un Apache 2 creado desde la fuente, y encontré que tenía que modificar lo siguiente en mi archivo httpd.conf :

Agregar MultiViews a Opciones:

Options Indexes FollowSymLinks MultiViews

Descomentar AddEncoding:

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

Comentario AddType:

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


mod_gzip comprimió contenido sobre la marcha también. Puede precomprimir los archivos al iniciar sesión en su servidor y hacerlo desde shell.

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