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.
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 formatsAddCharset 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# Expires headers (for better cache control) Header unset Pragma Header append Cache-Control "public" Header unset Last-Modified Header unset Pragma Header append Cache-Control "public" 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 # Compress all output labeled with one of the following MIME-types 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 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 -IndexesModPagespeed 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.
La configuración de Apache siempre me ha parecido barroca. Nginx es la auténtica salud… y más rápido.
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.
«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.
Creo que te voy a decepcionar Cenizo, porque si en MySQL la mascota era un delfín, en MariaDB es una foca.
Jajajaja, una foca?, Menuda decepción.
Muy interesante artículo Guti, mis respetos y admiración, muchas gracias.
Gracias don Ricardo.