Apache: envíe archivos gzip'ed preempaquetados

8

Quiero que Apache envíe archivos estáticos gzip'ed por cable, pero también quiero que Apache no siempre los gzip una y otra vez. Así que pensé si no sería posible entregar un archivo .gz si existiera. Esta configuración:

Estructura de archivo:

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

Y lo siguiente en un .htaccess:

regla mod_rewrite:

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

Y esta configuración:

AddEncoding x-gzip .gz

En realidad, esto funciona en la medida en que se envía el archivo .gz en lugar del .css, si la solicitud va a /static/style.css. El único problema es que el archivo se entrega como "application / x-gzip" y no como "text / css". El uso de la bandera T de mod_rewrite no altera esto. Tampoco un explícito

AddType text/css .css

¿Alguien tiene una idea, cómo podría lograr el comportamiento deseado? ¿O es innecesario por alguna razón que no calculé?

EDITAR: Hay una dificultad adicional: enviar el archivo original a clientes sin soporte de gzip. ¿Alguien tiene una idea de cómo podría funcionar esto?

Boldewyn
fuente
Me sorprende que esto no sea mucho más obvio, ya que parece una locura tener un servidor web que no haga esto. Creo que IIS tiene un sistema para almacenar en caché copias comprimidas de archivos estáticos en el primer acceso. mod_deflate no menciona tal característica.
rjmunro
Los documentos mod_deflate de apache tienen su propio ejemplo ahora: httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompressed
cweiske

Respuestas:

5

Una solución para enviar la versión correcta a los navegadores que no aceptan gzip sería algo como:

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

Además, hay otra forma de cambiar el tipo, a saber:

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

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

HTH.

Sam Halicke
fuente
¡Genial, gracias! ¿Hay documentos para la cosita% {HTTP: ...}? No vi ninguna mención al respecto en la sección RewriteCond de Apache 2.2. FilesMatch fue otra idea que tuve, pero pensé que era más detallada. Dado que ambas reglas deben encender el motor regexp, no debería haber una diferencia real.
Boldewyn
OK, encontré los documentos. httpd.apache.org/docs/2.2/mod/mod_rewrite.html Acabo de omitir la parte interesante.
Boldewyn
Esto no es un gran problema, pero al leer esa configuración, si alguien buscara manualmente el archivo .css.gz, obtendrían el texto / css, cuando deberían obtener el tipo de aplicación / x-gzip.
rjmunro
Porqué el ! antes de gzip en la línea Accept-Encoding? ¿Seguramente eso es lo contrario de lo que necesitas?
rjmunro
Estaba pensando lo mismo, que tiene sentido tener el RewriteCondúnico partido cuando el cliente hace aceptar la codificación gzip.
David Z
3

Ah, parece que encontré una solución: el indicador T no funciona si se establece en la misma regla, pero seguro que sí, si lo gastas como una regla propia:

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

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

Aún así me gustaría escuchar las soluciones y opiniones de los demás.

Boldewyn
fuente