
29 gen. Configurant un .htaccess perfecte
Índex
En realitat el títol d’aquest post porta una mica de Clickbait (altrament dit pescaclicks) ja que possiblement no hi ha un arxiu .htaccess perfecte. La realitat és que cada projecte hauria de tenir un arxiu .htaccess personalitzat exactament segons les seves necessitats.
Així i tot, sí que hi ha una sèrie d’indicacions interessants a tenir en compte per incloure dins el nostre .htaccess en el moment de la configuració inicial del nostre WordPress.
Abans de començar a remenar l’htaccess, és molt important fer una còpia de seguretat de com el tenim funcionant. Per aquest motiu, aquí us deixem el codi de l’htaccess natiu per defecte d’un WordPress funcionant sobre Apache amb les URL’s amigables activades:
.htaccess per defecte de WordPress
# BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress
Cal tenir en compte que el mateix WordPress modifica l’arxiu htaccess per ajustar-lo al funcionament que necessita segons l’arquitectura de la màquina i si (per exemple) està funcionant sobre Nginx, pot variar.
Habilitar la compresió GZip
És important habilitar la compressió GZip dels recursos a descarregar per tal de reduir el temps de càrrega de la pàgina i millorar mètriques de WPO (Web Performance Optimitzation):
# BEGIN Compresió GZip <IfModule mod_deflate.c> # Forçar compresió de capçaleres. <IfModule mod_setenvif.c> <IfModule mod_headers.c> 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 </IfModule> </IfModule> <IfModule mod_filter.c> AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/x-component AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript AddType x-font/otf .otf AddType x-font/ttf .ttf AddType x-font/eot .eot AddType x-font/woff .woff AddType image/x-icon .ico AddType image/png .png </IfModule> </IfModule> # END Compresió GZIP
Configurar l’expiració de la memoria caché
És important habilitar i especificar l’expiració de la memòria del navegador per accelerar la càrrega de segones visites. Els servidors web ben optimitzats ja ho haurien de tenir especificat per defecte, però no està de més controlar-ho des del nostre htaccess:
# BEGIN Expiració de memòria cache <IfModule mod_expires.c> ExpiresActive On # No generar mai cache de textos ni dades dinàmiques: ExpiresByType text/html "access 0 seconds" ExpiresByType text/xml "access 0 seconds" ExpiresByType application/xml "access 0 seconds" ExpiresByType application/json "access 0 seconds" ExpiresByType application/ld+json "access 0 seconds" ExpiresByType application/vnd.geo+json "access 0 seconds" # Expiració de cache d'imatges, vídeos, components, fonts, JS i CSS a 1 mes: ExpiresByType image/jpg "access 1 year" ExpiresByType image/jpeg "access 1 year" ExpiresByType image/gif "access 1 year" ExpiresByType image/png "access 1 year" ExpiresByType video/ogg "access 1 month" ExpiresByType audio/ogg "access 1 month" ExpiresByType video/mp4 "access 1 month" ExpiresByType video/webm "access 1 month" ExpiresByType text/css "access 1 month" ExpiresByType text/plain "access 1 month" ExpiresByType text/javascript "access 1 month" ExpiresByType text/x-component "access 1 month" ExpiresByType application/pdf "access 1 month" ExpiresByType application/javascript "access 1 month" ExpiresByType application/x-javascript "access 1 month" ExpiresByType application/x-shockwave-flash "access 1 month" ExpiresByType image/x-icon "access 1 year" ExpiresByType application/font-woff "access 1 month" ExpiresByType application/font-woff2 "access 1 month" ExpiresByType application/x-font-woff "access 1 month" ExpiresByType application/x-font-ttf "access 1 month" ExpiresByType font/opentype "access 1 month" ExpiresByType image/svg+xml "access 1 month" ExpiresByType application/vnd.ms-fontobject "access 1 month" # Expiració per defecte de la cache no especificada a 2 dies: ExpiresDefault "access 2 days" </IfModule> # END Expiració de memòria cache
Seguretat des de .htaccess
Per últim, sempre és important tenir en compte la seguretat i per aquest motiu nosaltres sempre utilitzem les següents normes des de l’.htaccess que eviten les peticiones d’URL més comunes en atacs a WordPress:
# BEGIN Seguretat # Protecció del propi arxiu .htaccess <Files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </Files> # Desactivar la navegació per directòris Options All -Indexes # Desactivar la firma del servidor ServerSignature Off ### Seguretat contra Injections ### # treure accés a proc/self/environ RewriteCond %{QUERY_STRING} proc/self/environ [OR] # bloquejar qualsevol script que vulgui canviar un valor mosConfig a través d'una URL RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR] # bloquejar qualsevol script que intenti injectar càdi codificat en base64_encode a través d'una URL RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR] # bloquejar qualsevol script que inclogui el tag <script> a la URL RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] # bloquejar qualsevol script que intenti establir la variable PHP GLOBALS a través d'una URL RewriteCond %{QUERY_STRING} GLOBALS(=|[|\%[0-9A-Z]{0,2}) [OR] # bloquejar qualsevol script que intenti modificar una variable _REQUEST a través d'una URL RewriteCond %{QUERY_STRING} _REQUEST(=|[|\%[0-9A-Z]{0,2}) # Enviar a totes les peticions bloquejades a la pàgina principal amb un error de 403 Prohibit RewriteRule ^(.*)$ index.php [F,L] # END Seguretat
Mostra de com queda el nostre .htacces perfecte
Aquí us deixem tots els codis recopilats a punt de fer “copy/paste” i veiem com queda el nostre arxiu .htaccess:
# BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress # BEGIN Compresió GZip <IfModule mod_deflate.c> # Forçar compresió de capçaleres. <IfModule mod_setenvif.c> <IfModule mod_headers.c> 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 </IfModule> </IfModule> <IfModule mod_filter.c> AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/x-component AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript AddType x-font/otf .otf AddType x-font/ttf .ttf AddType x-font/eot .eot AddType x-font/woff .woff AddType image/x-icon .ico AddType image/png .png </IfModule> </IfModule> # END Compresió GZIP # BEGIN Expiració de memòria cache <IfModule mod_expires.c> ExpiresActive On # No generar mai cache de textos ni dades dinàmiques: ExpiresByType text/html "access 0 seconds" ExpiresByType text/xml "access 0 seconds" ExpiresByType application/xml "access 0 seconds" ExpiresByType application/json "access 0 seconds" ExpiresByType application/ld+json "access 0 seconds" ExpiresByType application/vnd.geo+json "access 0 seconds" # Expiració de cache d'imatges, vídeos, components, fonts, JS i CSS a 1 mes: ExpiresByType image/jpg "access 1 year" ExpiresByType image/jpeg "access 1 year" ExpiresByType image/gif "access 1 year" ExpiresByType image/png "access 1 year" ExpiresByType video/ogg "access 1 month" ExpiresByType audio/ogg "access 1 month" ExpiresByType video/mp4 "access 1 month" ExpiresByType video/webm "access 1 month" ExpiresByType text/css "access 1 month" ExpiresByType text/plain "access 1 month" ExpiresByType text/javascript "access 1 month" ExpiresByType text/x-component "access 1 month" ExpiresByType application/pdf "access 1 month" ExpiresByType application/javascript "access 1 month" ExpiresByType application/x-javascript "access 1 month" ExpiresByType application/x-shockwave-flash "access 1 month" ExpiresByType image/x-icon "access 1 year" ExpiresByType application/font-woff "access 1 month" ExpiresByType application/font-woff2 "access 1 month" ExpiresByType application/x-font-woff "access 1 month" ExpiresByType application/x-font-ttf "access 1 month" ExpiresByType font/opentype "access 1 month" ExpiresByType image/svg+xml "access 1 month" ExpiresByType application/vnd.ms-fontobject "access 1 month" # Expiració per defecte de la cache no especificada a 2 dies: ExpiresDefault "access 2 days" </IfModule> # END Expiració de memòria cache # BEGIN Seguretat # Protecció del propi arxiu .htaccess <Files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </Files> # Desactivar la navegació per directòris Options All -Indexes # Desactivar la firma del servidor ServerSignature Off ### Seguretat contra Injections ### # treure accés a proc/self/environ RewriteCond %{QUERY_STRING} proc/self/environ [OR] # bloquejar qualsevol script que vulgui canviar un valor mosConfig a través d'una URL RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR] # bloquejar qualsevol script que intenti injectar càdi codificat en base64_encode a través d'una URL RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR] # bloquejar qualsevol script que inclogui el tag <script> a la URL RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] # bloquejar qualsevol script que intenti establir la variable PHP GLOBALS a través d'una URL RewriteCond %{QUERY_STRING} GLOBALS(=|[|\%[0-9A-Z]{0,2}) [OR] # bloquejar qualsevol script que intenti modificar una variable _REQUEST a través d'una URL RewriteCond %{QUERY_STRING} _REQUEST(=|[|\%[0-9A-Z]{0,2}) # Enviar a totes les peticions bloquejades a la pàgina principal amb un error de 403 Prohibit RewriteRule ^(.*)$ index.php [F,L] # END Seguretat
Com editar un arxiu .htaccess
Per editar un arxiu .htaccess ho podeu fer utilitzant qualsevol editor de text de forma local o utilitzant algun software de connexió remota per FTP. Però també ho podeu fer de forma més pràctica utilitzant l’eina “Editor de fitxers” del Plugin Yoast des d’on també podeu generar i editar l’arxiu robots.txt però això es mereix tot un altre post sencer.
Utilitzeu altres directrius als vostres .htaccess?
Ens les podeu deixar a comentaris amb l’explicació del per què i potser podem ampliar aquest post. ☺️
No Comments