Configurant un .htaccess perfecte

htaccess prefecte

Configurant un .htaccess perfecte

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

Post A Comment