El .htaccess es un archivo de configuración distribuido, y es cómo Apache maneja los cambios de configuración en una base por directorio.
WordPress utiliza este archivo para manipular cómo Apache muestra los archivos de su directorio raíz y subdirectorios de los mismos. Lo más notable es que WP modifica este archivo para poder manejar los permalinks y otras configuraciones que veremos a continuación, el archivo .htaccess debe de estar ubicado en la raíz de nuestra instalación y este lo podemos personalizar para mejorar el rendimiento, la seguridad y la facilidad de uso de nuestro sitio.
Por lo general luego de realizar nuestra instalación, WordPress agrega en nuestro archivo de configuración .htaccess las siguientes lineas para manipular los permalinks:
# 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
Para saber más acerca del archivo .htaccess en WordPress, por favor visita su documentación.
Lo anterior es una de las configuraciones mas básicas y comunes que veremos dentro de la configuración, sin embargo existen multitudes de otras configuraciones de las cuales mostraré algunas destacadas y como realizar adicionales cuando lo desees.
La recomendación
Recuerden que este archivo modifica la configuración de nuestro servidor lo que lo hace bastante sensible, por eso recomiendo siempre tener copia de seguridad antes de realizar cualquier cambio, esto nos dará seguridad y podremos restaurar una versión anterior si tenemos problemas.
Deshabilitar ver los directorios
De forma predeterminada, los servidores Apache mostrarán el contenido del archivo de cualquier directorio que no incluya un archivo de índice. Por ejemplo, si el directorio no incluye un archivo index.html, index.php o un archivo de índice similar, Apache mostrará su contenido y todo el mundo lo podrá ver. Podemos ver un ejemplo de vistas de directorios en Apache.org.
# DISABLE DIRECTORY INDEXES Options -Indexes
Establecer la codificación por defecto
Establecer la codificación predeterminada de su sitio como UTF-8
ayuda a los navegadores y dispositivos a interpretar correctamente el contenido de su página, esta codificación la podemos ajustar desde nuestro archivo wp-config.php en la raíz de nuestra instalación pero a nivel de servidor la podemos declarar desde nuestro .htaccess, esta directiva ayuda a mejorar la precisión y la coherencia de las páginas web.
# Set default encoding AddDefaultCharset UTF-8
También es posible establecer la codificación de caracteres para tipos de archivos específicos. Por ejemplo, aquí estamos configurando la codificación UTF-8 para todos los archivos CSS y JavaScript:
# Set encoding for CSS & JS <IfModule mod_mime.c> AddCharset utf-8 .html .css .js </IfModule>
Agregar Vary header
De acuerdo con Google y otros, los recursos compresibles deben incluir el siguiente encabezado:
Vary: Accept-Encoding
Esto es para impedir que determinados servicios proxy públicos entreguen versiones comprimidas de sus archivos a clientes que no soportan compresión. Enviar un encabezado Vary para recursos comprimidos ayuda a resolver este problema instruyendo al proxy para almacenar en caché versiones comprimidas y sin comprimir. Para implementar, agregue este código al archivo root .htaccess de su sitio:
# Add Vary header <IfModule mod_headers.c> <FilesMatch "\.(css|js|gz|xml)$"> Header append Vary: Accept-Encoding </FilesMatch> </IfModule>
Este código envía el encabezado Vary necesario para los archivos CSS, JavaScript, gzip y XML. Si su sitio ofrece otros recursos comprimidos, puede agregar sus respectivos tipos de archivo a la lista, de la siguiente manera:
\.(css|js|gz|xml|zip)$
Aquí hemos añadido el formato de archivo ZIP, zip.
Proteger el header
Hay muchas cabeceras útiles que se pueden agregar a cualquier sitio web. Por ejemplo, aquí hay tres encabezados que proporcionan algunos grandes beneficios en cuanto a la seguridad:
- Proteger contra ataques XSS
- Protegerse contra el enmarcado de páginas y el chasquido de clics
- Proteger contra la inhalación de contenido
Fácilmente, puede agregar estas ventajas de seguridad con una simple porción de .htaccess:
# Add Security Headers <IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" Header always append X-Frame-Options SAMEORIGIN Header set X-Content-Type-Options nosniff </IfModule>
Proteger los archivos sensibles
De forma predeterminada, todas las instalaciones de WordPress incluyen los siguientes archivos:
- wp-config.php – Archivo de configuración WP
- license.txt – Información de licencia WP
- readme.html – Información de instalación y versión de WP
De éstos, wp-config.php
por defecto NO debe ser de acceso público. Los otros dos archivos, license.txt
y readme.html
, por defecto, están públicamente accesibles. Los tres archivos contienen información acerca de su sitio de WordPress-powered. Al bloquear el acceso público a estos archivos, se evita que personas inescrupulosas obtengan y utilicen la información al elaborar sus ataques. Aquí está el código para que esto no suceda:
# Protect sensitive files <FilesMatch "^(wp-config.php|license.txt|readme.html)"> Order Allow,Deny Deny from all </FilesMatch>
Puedes agregar cualquier otro archivo sensible agregándolo a la directiva FilesMatch
en la linea 2.
Utiliza la cache del navegador
El caché del navegador desempeña un papel importante con todos los sitios web, especialmente WordPress. Esta técnica asegura que su sitio está aprovechando el almacenamiento en caché del explorador estableciendo ExpiresByType
encabezados HTTP óptimos.
# Leverage browser caching <IfModule mod_expires.c> ExpiresActive on ExpiresDefault "access plus 1 month" # ExpiresByType image/jpg "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType text/css "access plus 1 month" # ExpiresByType text/javascript "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" ExpiresByType text/x-javascript "access plus 1 month" # ExpiresByType image/x-icon "access plus 1 year" </IfModule>
Este código ayuda a optimizar el rendimiento de nuestra página estableciendo los encabezados de expiración para los tipos de archivo más comunes, también puedes agregar mas tipos de archivos.
Habilitar la compresión de archivos
La compresión de archivos reduce la cantidad de datos que se envían al cliente, por lo que es una excelente manera de mejorar el rendimiento. Afortunadamente, Apache permite la compresión a través de su módulo mod_deflate
, que se puede implementar con el siguiente código en el .htaccess:
# Enable file compression <IfModule mod_deflate.c> AddOutputFilter DEFLATE css js AddOutputFilterByType DEFLATE image/svg+xml image/x-icon AddOutputFilterByType DEFLATE application/vnd.ms-fontobject application/x-font-ttf font/opentype AddOutputFilterByType DEFLATE application/javascript application/x-javascript text/javascript text/x-js AddOutputFilterByType DEFLATE text/html text/plain text/richtext text/css application/json text/xsd text/xsl AddOutputFilterByType DEFLATE text/xml text/x-component application/xml application/xhtml+xml application/rss+xml application/atom+xml </IfModule>
Este código primero habilita la compresión para todos los archivos CSS y JavaScript, y a continuación, habilita la compresión para muchos otros tipos de archivos. Usted puede personalizar los formatos de archivo que deben comprimirse. Para obtener más información, echa un vistazo a todos los formatos admitidos.
Bloquear las solicitudes POST externas
Las solicitudes POST son requeridas cuando se envían algunos formularios. Por ejemplo, el formulario de comentarios, el formulario de inicio de sesión y también los formularios de contacto envían sus datos mediante el método de solicitud POST. Normalmente, las solicitudes POST son iniciadas por los usuarios que visitan un sitio web. Pero también es posible que personas malintencionadas o robots envíen solicitudes POST maliciosas desde otro dominio o fuente, en un intento de hackear tu sitio. Para evitar esto, podemos denegar el acceso a todas las solicitudes POST que no se inicien desde nuestro dominio. Esto se puede lograr con la siguiente porción de .htaccess:
# Block external POST <IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} POST RewriteCond %{REQUEST_URI} (wp-comments-post\.php|wp-login\.php|/contacto/) [NC] RewriteCond %{HTTP_REFERER} !(.*)example.com [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^$ RewriteRule .* - [L] </IfModule>
Debes de cambiar example.com por el nombre de tu dominio en cuestión, luego de realizar la implementación lo que nuestro código realizara sera lo siguiente:
- Verifica si la solicitud es POST.
- Verifica si la solicitud es para el formulario de comentarios o el formulario de inicio de sesión o el formulario que tenemos en la página de contacto.
- Comprueba si la solicitud no es de su dominio o si el agente de usuario está vacío
- Si estas condiciones son verdaderas, se rechaza la solicitud a través de 403 Respuesta “Prohibida”
Protegete del Hotlinking
El Hotlinking o el robo de ancho de banda, se da cuando se enlazan las imágenes o archivos de tus artículos o post a páginas externas, esta practica la podemos evitar de la siguiente manera:
# Block Hotlinking RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www.)?tu_dominio.com/.*$ [NC] RewriteRule .(gif|jpg)$ http://www.tu_dominio.com/hotlink.gif [R,L]
Recuerda cambiar el nombre de tu dominio en la linea #4 y agregar la url de la imagen que desees se muestre explicando que esta prohibido hacer Hotlinking en tu sitio.
Este tema también fue tratado en un artículo anterior acerca de la seguridad de WordPress.
Prohibe el acceso a tu admin por medio de IP
Puedes prohibir el acceso a tu sitio mediante la IP deseada, si utilizas plugins de seguridad por lo general revelan la IP desde donde tu atacante intenta ingresar, puedes agregar esta IP dentro de un archivo .htaccess
ya sea en la raíz de tu instalación evitandole el ingreso a tu página o también en el directorio /wp-admin/
para que no pueda intentar acceder a la administración.
<Limit GET POST> order allow,deny deny from 123.456.11.22 deny from 123.456.11.22 allow from all </Limit>
Nota: Deberías evitar usar ficheros .htaccess completamente si tiene acceso al fichero de configuración principal de httpd. Usar ficheros .htaccess disminuye la velocidad de su servidor Apache http. Cualquier directiva que pueda incluir en un fichero .htaccess estará mejor configurada dentro de una sección Directory, tendrá el mismo efecto y mejor rendimiento.
Que herramientas adicionales utilizas para personalizar tu archivo .htaccess? 🔐
Fuentes usadas: