Blog sobre desarrollo WordPress en Español Desarrollo WordPress en Español
htaccess wordpress

Creando el .htaccess perfecto para WordPress

El fichero .htaccess es un archivo de configuración de Apache. Nos permite establecer reglas en un directorio, por ejemplo, WordPress lo usa para crear una estructura de enlaces amigables o permalinks.

htaccess

Además se pueden establecer otra serie de cosas como caché, compresión, restricción a ficheros y/o directorios, etc

Vamos a crear un archivo .htaccess para nuestro WordPress con las siguientes características:

  • Protección del propio archivo .htaccess
  • Protección de los archivos license.txt, readme.html y wp-config.php
  • Desactivar la navegación por directorios
  • Desactivar la firma del servidor
  • Seguridad contra hacking e Injections
  • Caché de archivos
  • Compresión Gzip
  • Enlaces amigables

Nuestro archivo .htaccess optimizado para WordPress quedaría de la siguiente manera:

#Protección del propio archivo .htaccess <Files ~ "^.*\.([Hh][Tt][Aa])"> order allow,deny deny from all satisfy all </Files> #Protección de los archivos license.txt, readme.html y wp-config.php <FilesMatch "^(license|readme|wp-config|wp-config-sample).*$"> order allow,deny deny from all </FilesMatch> #Desactivar la navegación por directorios Options All -Indexes #Desactivar la firma del servidor ServerSignature Off #BEGIN Seguridad contra hacking e Injections # sin acceso a proc/self/environ RewriteCond %{QUERY_STRING} proc/self/environ [OR] # bloquear cualquier script que trate de establecer un valor mosConfig a través de una URL RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR] # bloquear cualquier script que trate de colocarte código codificado base64_encode a través de una URL RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR] # bloquea cualquier script que incluya la tag <script> en la URL RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] # bloquea cualquier script que trate de establecer la variable PHP GLOBALS a través de una URL RewriteCond %{QUERY_STRING} GLOBALS(=|[|\%[0-9A-Z]{0,2}) [OR] # bloquea cualquier script que trate de modificar una variable _REQUEST a través de una URL RewriteCond %{QUERY_STRING} _REQUEST(=|[|\%[0-9A-Z]{0,2}) # manda a todas las peticiones bloqueadas a la página principal con un error de 403 Prohibido RewriteRule ^(.*)$ index.php [F,L] #END Seguridad contra hacking e Injections #BEGIN Caché de archivos <IfModule mod_expires.c> ExpiresActive on # Por defecto 1 mes de caché ExpiresDefault "access plus 1 month" # El HTML nunca debe de ser cacheado, así como los datos dinámicos ExpiresByType text/html "access plus 0 seconds" ExpiresByType text/xml "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" ExpiresByType application/json "access plus 0 seconds" ExpiresByType application/ld+json "access plus 0 seconds" ExpiresByType application/vnd.geo+json "access plus 0 seconds" # HTML components (HTCs) ExpiresByType text/x-component "access plus 1 month" # Favicon ExpiresByType image/x-icon "access plus 3 months" # Imágenes, vídeo, audio: 1 mes ExpiresByType image/gif "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType video/ogg "access plus 1 month" ExpiresByType audio/ogg "access plus 1 month" ExpiresByType video/mp4 "access plus 1 month" ExpiresByType video/webm "access plus 1 month" # Fuentes web: 1 mes ExpiresByType application/font-woff "access plus 1 month" ExpiresByType application/font-woff2 "access plus 1 month" ExpiresByType application/x-font-woff "access plus 1 month" ExpiresByType application/x-font-ttf "access plus 1 month" ExpiresByType font/opentype "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType application/vnd.ms-fontobject "access plus 1 month" # CSS y JavaScript: 1 mes ExpiresByType text/css "access plus 1 month" ExpiresByType text/javascript "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" ExpiresByType application/x-javascript "access plus 1 month" ExpiresByType text/plain "access plus 1 month" </IfModule> # Eliminar E-Tag <IfModule mod_headers.c> Header unset ETag </IfModule> FileETag None #END Caché de archivos #BEGIN Compresión GZIP <IfModule mod_deflate.c> # Force compression for mangled headers. <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ón GZIP #BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> #END WordPress

Puede que también te interese

Cómo reemplazar la hoja de estilos de un plugin por una propia
Cómo reemplazar la hoja de estilos de un plugin por una propia
En muchas ocasiones nos habremos encontrado con ésta situación: Instalamos un plugin que posee sus propios estilos y clases, y no encaja bien en nuestro…
Creando un plugin para WordPress parte 2: Estilo del Código
Creando un plugin para WordPress parte 2: Estilo del Código
1. Creando un plugin para WordPress: Planificación y planteamiento 2. Creando un plugin para WordPress: Estilo del Código 3. Creando un plugin para WordPress: Escribiendo…
Cómo añadir campos personalizados o custom fields al back-end de WordPress de forma elegante
Cómo añadir campos personalizados o custom fields al back-end de WordPress de forma elegante
En esta entrada vamos a ver como añadir campos personalizados o custom fields al back-end de WordPress de manera elegante, es decir, utilizando meta_boxes. Actualmente…
Seguridad WordPress: usa un Captcha para login
Seguridad WordPress: usa un Captcha para login
Otro “filtro” que podemos usar para proteger nuestro panel de administración o back-end. Instalando un plugin como WP Login reCAPTCHA, podremos insertar el reCAPTCHA de…