Hoy quiero hablarte del archivo .htaccess en WordPress. Hay muchísimos artículos en la red sobre este fichero y voy a intentar agrupar y reunir lo que realmente es interesante sobre este tema en esta Megaguía que usamos en nuestra agencia de diseño web, donde resolveremos dudas del tipo:
¿Qué es un .htaccess? ¿Cuáles son las utilidades comunes de este fichero? ¿Hay trucos para mejorar el rendimiento y la seguridad de mi web?
¿Qué es el archivo .htaccess?
Es un fichero de configuración del servidor web Apache
Con el archivo .htaccess es posible configurar para tu web algunas directivas (o formas de distintas formas de actuar) de las que dispone el servidor web.
Es un archivo oculto, por eso comienza con un ‘.’ delante.
El archivo .htaccess permite ajustes personalizados para cada sitio, haciendo uso de unas directivas de configuración del sistema.
Nunca se debe dar permisos de escritura para el archivo .htaccess, lo más habitual es conceder permisos 644, lo que permite acceso de lectura y permiso de escritura solamente al usuario del sistema.
Ten en cuenta que si das acceso con el archivo .htaccess no sólo estarás dando acceso a los subdirectorios donde esté situado, si no que el directorio principal también puede verse afectado.
Por lo tanto si no quieres que afecte a todo tu sitio web, en lugar de añadir el archivo .htaccess a la carpeta raíz de tu página, puedes añadirlo a un subdirectorio o directorio concreto, para que sus accesos de lectura sólo se apliquen en ese sitio.
Advertencia sobre .htaccess
El uso de este archivo puede ser peligroso si no se usa bien. Se puede provocar una caída de la web en el servidor. Es importante tener siempre una copia de tu sitio web, por si ocurre algún incidente.
Incluyendo también los ficheros .htaccess al ser editados.
Expresiones regulares (regex) en .htaccess
Con el símbolo # se le indica al servidor que ignore la línea,por tanto no se ejecuta. Ejemplo:
# esto es un comentario
[F] Forbidden (prohibido): Le indica al servidor que devuelva un 403 Forbidden.
[L] Last rule (última regla): Le indica al servidor que pare de realizar mod rewrite una vez se haya porcesado la directiva anterior.
[N] Next (siguiente): Con él, Apache vuelve a ejecutar el rewrite hasta que todas las directivas de rewrite se hayan ejecutado correctamente.
[G] Gone (ido): Le indica al servidor que muestre el mensaje Gone (no longer exists).
[P] Proxy: Le indica al servidor que gestione las peticiones realizadas mediante mod_proxy
[C] Chain (cadena): Le indica al servidor que concatene la regla actual con la anterior.
[R] Redirect (redirigir): le dice a Apache que ejecute una redirección, forzando al navegador a que muestre la URL re-escrita/editada.
[PT] Pass Through (pasar a través): mod_rewrite pasa la URL edtada a Apache para que la procese otra vez.
[OR] Or (o): operador logico “O”,une dos expresiones para que si una u otra se cumple, aplicar la regla asociada a la misma.
[NS] No Subrequest (sin petición subyacente): Le indica al servidor que se salte la directiva en el caso de que existan directivas internas subyacentes.
Códigos de redirección de cabecera
- Código 301 – movido permanentemente
- Código 302 – movido temporalmente
- Código 403 – prohibido
- Código 404 – no encontrado
- Código 410 – ido
Directivas básicas de .htaccess
Activar el rewrite básico
Hay algunos hostings que no tienen el “mod_rewrite” activado por defecto.
Para activarlo se añade la siguiente línea en el archivo .htaccess:
# activar rewrite básico
RewriteEngine on
Activar enlaces simbólicos
Ten en cuenta que deben estar activos los privilegios AllowOverride Options en el archivo de configuración del servidor para que funcione la directiva FollowSymLinks, por lo tanto recuerda activar los enlaces symlinks en el archivo .htaccess:
# activar enlaces simbólicos
Options +FollowSymLinks
Activar AllowOverride
Si quieres que directivas asociadas a AllowOverride, como FollowSymLinks funcionen adecuadamente, se deben añadir las siguientes directivas al archivo de configuración del servidor.
Muy importante activar AllowOverride sólo en el directorio concreto en que queramos que actué.
# activa privilegios de allowoverride
<Directory /www/public/assets/js/template>
AllowOverride Options
</Directory>
.htaccess permite mejorar el rendimiento de tu sitio web
Vamos a ver como mejorar el rendimiento de nuestra web haciendo uso de .htaccess
AllowOverride
Si se activa AllowOverride en todo la web, el server tiene que revisar cada directorio, localizando archivos .htaccess que puede que no existan.
Para que no ocurra esto se debe desactivar AllowOverride en el fichero .htaccess de la carpeta raíz del sitio y tan solo activarlo en aquellos directorios donde sea necesaria desde el archivo de configuración del servidor.
En caso de no disponer de acceso a este archivo de configuración y de necesitar privilegios de AllowOverride no se debe hacer uso de esta directiva:
# mejorar rendimiento desactivando allow override
AllowOverride None
Indicando el Charset
Podemos definir el Charset por defecto antes de cargarlos.
# indicamos el Charset por defecto
AddDefaultCharset utf-8
Ahorrar ancho de banda
Se puede aumentar el rendimiento en servidores con PHP (por ejemplo son de los que hace uso WordPress):
# ahorrar ancho de banda para PHP
<ifmodule mod_php4.c>
php_value zlib.output_compression 10475
</ifmodule>
Establecer zona horaria del server
# establecer zona horaria del server
SetEnv TZ Spain/Madrid
Dirección de email del administrador del hosting
# dirección email administrador del servidor
SetEnv SERVER_ADMIN admin@miweb.com[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]
Mejorar velocidad de transferencia al activar la caché de archivos
Indicamos el tiempo en segundos para editar la duración del contenido en caché:
<FilesMatch «.(flv|gif|jpg|jpeg|png|ico|swf)$»>
Header set Cache-Control «max-age=2592000»
</FilesMatch>
<FilesMatch «.(js|css|pdf|txt)$»>
Header set Cache-Control «max-age=604800»
</FilesMatch>
<FilesMatch «.(html|htm)$»>
Header set Cache-Control «max-age=43200»
</FilesMatch>
archivos
ExpiresActive On
ExpiresDefault A604800
ExpiresByType image/x-icon A2419200
ExpiresByType application/x-javascript A2419200
ExpiresByType text/css A2419200
ExpiresByType text/html A300
<FilesMatch «\.(pl|php|cgi|spl|scgi|fcgi)$»>
ExpiresActive Off
</FilesMatch>
Declarar tipos MIME específicos/adicionales
AddType application/x-shockwave-flash .swf
AddType video/x-flv .flv
AddType image/x-icon .ico
Editar el Charset y otras cabeceras sin meta tags
# AddType ‘text/html; charset=UTF-8’ html
AddDefaultCharset UTF-8
DefaultLanguage es-ES
Limitar métodos GET y PUT al hosting
Options -ExecCGI -Indexes -All
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD) RewriteRule .* – [F]
Mejorar con .htaccess la seguridad en nuestra página web
Bloquear acceso a .htaccess
Añadiendo la siguiente directiva conseguimos que los intentos para acceder al fichero .htaccess devuelva un error 403. De todas formas, lo primero que debemos hacer como protección es editar los permisos a 644:
<Files .htaccess>
order allow,deny
deny from all
</Files>
Evitar acceso a archivos en concreto
# evitar el acceso de un archivo
<files prueba.txt>
order allow,deny
deny from all
</files>
Evita acceso a varios archivos
<FilesMatch «\.(htaccess|ini|phps|psd|sh)$»>
Order Allow,Deny
Deny from all
</FilesMatch
Evita la navegación de directorios no autorizada
Para que no se pueda navegar a través de un directorio desde el navegador, se pueden utilizar estas directivas, las cuales devolverán un mensaje indicando “Prohibido – Se requiere autorización”
Options All -Indexes
Si deseamos permitirlo:
Options All +Indexes
Tambien podemos hacer uso de la directiva IndexIgnore para que no se muestren ciertos archivos:
IndexIgnore *.wmv *.mp4 *.avi *.etc
Modificar página inicio
Esta regla le indica al server que se debe cargar “prueba.html” como index del directorio.
DirectoryIndex prueba.html
Forzar SSL
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq «dominio.es»
ErrorDocument 403 https://dominio.es
# forzar SSL sn hacer uso mod_ssl
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
Realizar CHMOD de diferentes tipos de archivo
Podemos modificar los permisos mediante CHMOD, situaremos las reglas en nuestro .htaccess en la carpeta raíz para modificar todos los tipos de archivos que deseemos.
chmod js files 640
chmod .htaccess files 644
chmod php files 600
Ocultar las extensiones de los archivos
Podemos modificar las extensiones de los archivos para que se muestren como un tipo de archivos diferente, como por ejemplo, que todas las extensiones sean .php
ForceType application/x-httpd-php
Protección contra DDOS limitando el tamaño de subida de los archivos
Podemos limitar el tamaño de la subida de los archivos.
LimitRequestBody 10240000
Usabilidad
Mostrar las páginas de error personalizadas
ErrorDocument 400 /logs/400.html
ErrorDocument 401 /logs/401.html
ErrorDocument 403 /logs/403.html
ErrorDocument 404 /logs/404.html
ErrorDocument 500 /logs/500.html
Mostrar un archivo para errores global
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /logs/logs.php [L]
Forzar la descarga de los archivos multimedia para no cargarlos en el navegador
AddType application/file .avi
AddType application/file .mpg
AddType application/file .wmv
AddType application/file .mp3
Trucos de redirección
mod_rewrite
Debe estar activada la directiva RewriteEngine para que funcionen las redirecciones realizadas con mod_rewrite.
RewriteEngine on
Redirección de http://www.miweb.es a http://miweb.es
RewriteEngine on
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^www\.miweb\.es$ [NC]
RewriteRule ^(.*)$ http://miweb.es/$1 [R=301,L]
Redirección de http://oldweb.es a http://newweb.es
RewriteEngine On
RewriteRule ^(.*)$ http://newweb.es/$1 [R=301,L]
Redirigir a otra URL en base a una cadena concreta
Por ejemplo, podemos redirigir a una categoría de nuestra web, cuando cualquier petición tenga en su contenido el carácter “prueba”.
RewriteRule ^prueba http://miweb.com/categoria/prueba/ [R]
Truco especial para WordPress
Formularios
En WordPress podemos verificar el dominio desde donde se esta llamando para ejecutar los formularios.
RewriteCond %{HTTP_REFERER} !^http://www.miweb.es/.*$ [NC]
RewriteCond %{REQUEST_POST} .*contact.php$
RewriteRule .* – [F]
Espero haber resuelto tus dudas sobre el archivo .htaccess en esta megaguía.
Si tienes otros trucos y directivas de htaccess que quieras compartir con nosotros, los espero en los comentarios 🙂