w3schools tag tab page change javascript apache .htaccess mod-rewrite http-compression

javascript - tag - ¿Cómo alojar contenido estático pre-comprimido en apache?



title of page html (4)

¿Qué hay de la solución descrita aquí? http://feeding.cloud.geek.nz/posts/serving-pre-compressed-files-using/ . Utilice las vistas múltiples incorporadas de Apache ...

Tengo un juego de JavaScript que básicamente consiste en un archivo .html y un archivo .data. Si los comprimo con gzip, su tamaño se reduce al 25%. Así que quiero hacer eso.

No estoy 100% seguro, pero creo que usar mod_gzip o mod_deflate realiza la compresión sobre la marcha, perdiendo el tiempo de CPU todo el tiempo porque el contenido no cambia.

Así que me gustaría precompilar el contenido. Por lo tanto, coloco un .gz junto a los archivos sin comprimir y pongo las reglas de reescritura en .htaccess:

RewriteEngine on # If client accepts compressed files RewriteCond %{HTTP:Accept-Encoding} gzip # and if compressed file exists RewriteCond %{REQUEST_FILENAME}.gz -f # send .html.gz instead of .html RewriteRule ^(.+)/.(html|css|js|data)$ $1.$2.gz [T=text/$2,E=GZIP:gzip,L] Header set Content-Encoding gzip env=GZIP

El redireccionamiento está funcionando, puedo solicitar game.html y, de hecho, puedo entregar game.html.gz. Sin embargo, el navegador no solo lo muestra. En su lugar, me pregunta dónde guardar el archivo. ¿Cómo puedo arreglar eso? O tal vez hay otra manera de lograr mi objetivo?


Así es como solucioné una vez el mismo problema.

Añadir nuevos tipos en .htaccess:

AddEncoding gzip .jsgz .cssgz .htmlgz .datagz AddType application/javascript .jsgz AddType text/css .cssgz AddType text/html .htmlgz AddType text/plain .datagz

Esto se hizo de esta manera porque AddType instrucción AddType no aceptó extensiones en la forma .html.gz.

Luego modifique su regla de reescritura:

RewriteRule ^(.+)/.(html|css|js|data)$ $1.$2gz [L]

Y finalmente renombra tus archivos. Elimine puntos de .html.gz, .js.gz y así sucesivamente.

El .htaccess completo se vería así:

AddEncoding gzip .jsgz .cssgz .htmlgz .datagz AddType application/x-javascript .jsgz AddType text/css .cssgz AddType text/html .htmlgz AddType text/plain .datagz RewriteEngine on # If client accepts compressed files RewriteCond %{HTTP:Accept-Encoding} gzip # and if compressed file exists RewriteCond %{REQUEST_FILENAME}gz -f # send .html.gz instead of .html RewriteRule ^(.+)/.(html|css|js|data)$ $1.$2gz [L]


La primera pregunta que debe hacerse es si hay algún punto en hacer esto. ¿Notan una carga de CPU y / o una diferencia de rendimiento demasiado altas debido a esto? Supongo que es probable que no te encuentres con este problema :)

Sin embargo, a pesar de ello, hay varias formas de solucionar su problema.

  1. Probablemente la mejor opción para ti, usa un CDN. Están diseñados para la entrega rápida de archivos estáticos y lo harán rápido para las personas en un área geográfica diferente, así como para las personas cercanas a su servidor. Además, en mi experiencia, las CDN suelen ser mucho más baratas de lo que será su propio ancho de banda.

  2. Utilice Nginx. Para alojar archivos estáticos mucho más rápido y tiene soporte para la generación previa de contenido estático como lo está haciendo ahora. Detectará automáticamente si hay un archivo .gz y lo servirá cuando sea necesario.

  3. Utilice uno de los mecanismos de caché de Apache como mod_mem_cache o mod_disk_cache para asegurarse de que todos los archivos utilizados regularmente estén en caché. Tutorial: http://webdirect.no/linux/apache-caching-with-gzip-enabled/

  4. Use un proxy de almacenamiento en caché como Varnish al frente, este tipo de servidores tiene un mecanismo de almacenamiento en caché mucho más inteligente y en realidad almacenará en caché los archivos que más importan.

Sin embargo, para su versión actual, algo como esto (no probado) debería hacer el truco:

RewriteEngine On RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}/.gz -s RewriteRule ^(.*)/.(html|css|js|data) $1/.$2/.gz [QSA] # Prevent double gzip and give the correct mime-type RewriteRule /.css/.gz$ - [T=text/css,E=no-gzip:1,E=FORCE_GZIP] RewriteRule /.js/.gz$ - [T=text/javascript,E=no-gzip:1,E=FORCE_GZIP] RewriteRule /.html/.gz$ - [T=text/html,E=no-gzip:1,E=FORCE_GZIP] RewriteRule /.data/.gz$ - [T=text/plain,E=no-gzip:1,E=FORCE_GZIP] Header set Content-Encoding gzip env=FORCE_GZIP


La respuesta aceptada parece bastante dolorosa. share parece mejor, pero aún requiere una configuración separada para cada extensión de archivo y carece de soporte para una negociación más avanzada ( q-values , estado 406 , TCN , etc.). En lugar de implementar la negociación de contenido utilizando mod_rewrite , puede considerar usar mod_negotiation como se explica en esta pregunta . Copiando mi respuesta desde allí:

Options +MultiViews RemoveType .gz AddEncoding gzip .gz <FilesMatch ".+/.tar/.gz$"> RemoveEncoding .gz # Note: Can use application/x-gzip for backwards-compatibility AddType application/gzip .gz </FilesMatch>

Esto tiene la ventaja adicional de trabajar para todos los archivos .gz lugar de solo los configurados explícitamente y se puede extender fácilmente para brotli u otras codificaciones.

Tiene un gran inconveniente, ya que solo las solicitudes de archivos que no existen se negocian, un archivo llamado foo.js haría solicitudes de /foo.js (pero no /foo ) devolverá la versión sin comprimir. Esto se puede evitar utilizando la solución de François Marier de cambiar el nombre de los archivos no comprimidos con una extensión doble, por lo que foo.js se implementa como foo.js.js