Optimizaciones de .htaccess para tu web y también para WordPress

Cuando me preparé para escribir Nulled WP-Rocket y cómo parchearlo necesariamente me tuve que familiarizar con el funcionamiento del plugin WP-Rocket. Me di cuenta que aunque es el más rápido del mercado, todavía lo podía ser aún más, puesto que había algunas optimizaciones elementales a nivel de .htaccess que no habían aplicado.

Como forma de devolverles el favor decidí sugerírselas por lo que supongo que pronto las tendrán disponibles. De hecho también les apunté a optimizar estáticamente sus imágenes (PNG y SVG) que con FileOptimizer ahorrarían casi 64 KB., aunque en esto no me hicieron caso.

Optimizaciones de .htaccess para tu web y también para WordPress

A lo que íbamos, estos ajustes que menciono los puedes aplicar tu mismo, tanto si usas WP-Rocket como cualquier otro plugin de caché (WP Fastest Cache, Super Cache, W3 Total Cache), e incluso si no utilizas ninguno en absoluto.

Se encargan de modificar algunas opciones del servidor web Apache para:
– Aumentar la velocidad de carga estableciendo la fecha de expiración de los recursos (Leverage Browser Caching).
– Reducir el tamaño de las páginas y por tanto aumentando su velocidad activando la compresión GZIP, Deflate y la nueva Brotli.
– Mejorar la seguridad con algunos nuevos encabezados.
– Mejorar el rendimiento gracias a Google Page Speed en el caso de que mod_pagespeed.so esté instalado.

# Use UTF-8 encoding for anything served text/plain or text/html
AddDefaultCharset UTF-8
# Force UTF-8 for a number of file formats

	AddCharset UTF-8 .atom .css .js .json .rss .vtt .xml

# FileETag None is not enough for every server.

	Header unset ETag

# Since we’re sending far-future expires, we don’t need ETags for static content.
# developer.yahoo.com/performance/rules.html#etags
FileETag None

	
		
			Header unset Pragma
			Header append Cache-Control "public"
			Header unset Last-Modified
		
	
	
		
			Header unset Pragma
			Header append Cache-Control "public"
		
	

# Expires headers (for better cache control)

	ExpiresActive on
	ExpiresDefault                              "access plus 1 month"
	# cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)
	ExpiresByType text/cache-manifest           "access plus 0 seconds"
	# Your document html
	ExpiresByType text/html                     "access plus 0 seconds"
	# Data
	ExpiresByType text/xml                      "access plus 0 seconds"
	ExpiresByType application/xml               "access plus 0 seconds"
	ExpiresByType application/json              "access plus 0 seconds"
	# Feed
	ExpiresByType application/rss+xml           "access plus 1 hour"
	ExpiresByType application/atom+xml          "access plus 1 hour"
	# Favicon (cannot be renamed)
	ExpiresByType image/x-icon                  "access plus 1 week"
	# Media: images, video, audio
	ExpiresByType image/gif                     "access plus 4 months"
	ExpiresByType image/png                     "access plus 4 months"
	ExpiresByType image/jpeg                    "access plus 4 months"
	ExpiresByType image/webp                    "access plus 4 months"
	ExpiresByType video/ogg                     "access plus 4 months"
	ExpiresByType audio/ogg                     "access plus 4 months"
	ExpiresByType video/mp4                     "access plus 4 months"
	ExpiresByType video/webm                    "access plus 4 months"
	# HTC files  (css3pie)
	ExpiresByType text/x-component              "access plus 1 month"
	# Webfonts
	ExpiresByType font/ttf                      "access plus 4 months"
	ExpiresByType font/otf                      "access plus 4 months"
	ExpiresByType font/woff                     "access plus 4 months"
	ExpiresByType font/woff2                    "access plus 4 months"
	ExpiresByType image/svg+xml                 "access plus 1 month"
	ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
	# CSS and JavaScript
	ExpiresByType text/css                      "access plus 1 year"
	ExpiresByType application/javascript        "access plus 1 year"

# Gzip compression

	# Active compression
	SetOutputFilter DEFLATE
	# Force deflate for mangled headers
	
		
			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
			RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
			# Don’t compress images and other uncompressible content
			SetEnvIfNoCase Request_URI \
			\.(?:gif|jpe?g|png|rar|zip|exe|flv|mov|wma|mp3|avi|swf|mp?g|mp4|webm|webp|pdf)$ no-gzip dont-vary
		
	
	# Compress all output labeled with one of the following MIME-types
	
		AddOutputFilterByType DEFLATE application/atom+xml \
                  application/javascript \
                  application/json \
                  application/rss+xml \
                  application/vnd.ms-fontobject \
                  application/x-font-ttf \
                  application/xhtml+xml \
                  application/xml \
                  font/opentype \
                  image/svg+xml \
                  image/x-icon \
                  text/css \
                  text/html \
                  text/plain \
                  text/x-component \
                  text/xml
	
	
		Header append Vary: Accept-Encoding
	


	AddType text/html .html_gzip
	AddEncoding gzip .html_gzip


	SetEnvIfNoCase Request_URI \.html_gzip$ no-gzip


	RewriteEngine On
	RewriteBase /
	RewriteCond %{HTTPS} on [OR]
	RewriteCond %{SERVER_PORT} ^443$ [OR]
	RewriteCond %{HTTP:X-Forwarded-Proto} https
	RewriteRule .* - [E=WPR_SSL:-https]
	RewriteCond %{HTTP_ACCEPT} image/webp
	RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/.no-webp" !-f
	RewriteRule .* - [E=WPR_WEBP:-webp]
	RewriteCond %{HTTP:Accept-Encoding} gzip
	RewriteRule .* - [E=WPR_ENC:_gzip]
	RewriteCond %{REQUEST_METHOD} GET
	RewriteCond %{QUERY_STRING} =""
	RewriteCond %{HTTP:Cookie} !(wordpress_logged_in_.+|wp-postpass_|wptouch_switch_toggle|comment_author_|comment_author_email_) [NC]
	RewriteCond %{REQUEST_URI} !^(/(.+/)?feed/?.+/?|/(?:.+/)?embed/|/(index\.php/)?wp\-json(/.*|$))$ [NC]
	RewriteCond %{HTTP_USER_AGENT} !^(facebookexternalhit).* [NC]
	RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}%{ENV:WPR_WEBP}.html%{ENV:WPR_ENC}" -f
	RewriteRule .* "/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}%{ENV:WPR_WEBP}.html%{ENV:WPR_ENC}" [L]


ServerSignature Off
Options -Indexes

	ModPagespeed on
	ModPagespeedRewriteLevel OptimizeForBandwidth
	ModPagespeedForceCaching on
	ModPagespeedEnableCachePurge on
	ModPagespeedEnableFilters collapse_whitespace,extend_cache,combine_heads,elide_atttributes,remove_quotes
	ModPagespeedEnableFilters prioritize_critical_css,rewrite_css,fallback_rewrite_css_urls,move_css_to_head
	ModPagespeedEnableFilters canonicalize_javascript_libraries,rewrite_javascript,defer_javascript,make_google_analytics_async
	ModPagespeedEnableFilters recompress_images,sprite_images,recompress_webp,responsive_images,resize_images,lazyload_images,convert_jpeg_to_progressive
	ModPagespeedEnableFilters convert_png_to_jpeg,convert_jpeg_to_webp


	Header set Connection keep-alive


	Header set X-XSS-Protection "1; mode=block"
	Header always append X-Frame-Options SAMEORIGIN
	Header set X-Content-Type-Options nosniff
	Header always set Referrer-Policy "no-referrer, strict-origin-when-cross-origin"


	mod_gzip_on Yes
	mod_gzip_dechunk Yes
	mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
	mod_gzip_item_include handler ^cgi-script$
	mod_gzip_item_include mime ^text/.*
	mod_gzip_item_include mime ^application/x-javascript.*
	mod_gzip_item_exclude mime ^image/.*
	mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*


	#BrotliCompressionQuality 6
	AddOutputFilterByType BROTLI_COMPRESS application/atom+xml \
		                          application/javascript \
		                          application/json \
		                          application/rss+xml \
		                          application/vnd.ms-fontobject \
		                          application/x-font-ttf \
		                          application/xhtml+xml \
		                          application/xml \
		                          font/opentype \
		                          image/svg+xml \
		                          image/x-icon \
		                          text/css \
		                          text/html \
		                          text/plain \
		                          text/x-component \
		                          text/xml

Lo mejor de todo es que no necesitas ningún plugin para aumentar el rendimiento de tu web, esté construida en la plataforma que esté construida, porque son añadidos que puedes agregar directamente a tu servidor web usando el .htaccess. Como ves, comprueban que la funcionalidad esté disponible en el entorno antes de usarse, así que no tienen riesgo de romper nada, eso sí, haz una copia de seguridad del archivo antes de tocarlo, no vaya a ser que se estropeé algo.

Unas pocas opciones son de mi propia cosecha, es decir, las he evaluado yo sin haberlas visto mencionadas en demasiado sitios. Sin embargo la mayoría están sacadas de un sitio y de otro.

Optimizaciones de .htaccess para tu web y también para WordPress

6 comentarios en “Optimizaciones de .htaccess para tu web y también para WordPress”

  1. Javier Gutiérrez Chamorro (Guti)

    Estoy de acuerdo un relojista, tiene tanto código heredado y tanta retrocompatibilidad que acaba siendo imposible de gestionar. Hace años fui un defensor de nginx, pero el no tener una capa de configuración compatible Apache al final hace que muchas cosas que dependen de él no funcionen. En ese sentido me gusta más OpenLiteSpeed. Lástima que en mi hosting (Dreamhost) tenga que seguir tragando con Apache, y también con MySQL en vez de MariaDB.

  2. «no hay miedo de estropear nada, pero haz una copia de seguridad por si se estropea algo», muy bueno, jajajaja!

    ¿Quién es María DB? Yo también quiero conocerla.

  3. Javier Gutiérrez Chamorro (Guti)

    Creo que te voy a decepcionar Cenizo, porque si en MySQL la mascota era un delfín, en MariaDB es una foca.

  4. Jajajaja, una foca?, Menuda decepción.
    Muy interesante artículo Guti, mis respetos y admiración, muchas gracias.

Deja un comentario