Inicio Hosting WordPress SEO Marketing VacaWeb.com 🚀 Hosting desde $85 MXN/mes
Tutoriales

.htaccess: Guía de Redirecciones y Optimización para tu Sitio Web

15 Dic 2025 14 min de lectura VacaWeb Blog

Tutorial completo del archivo .htaccess. Redirecciones 301 y 302, forzar HTTPS, proteger directorios, comprimir archivos y mejorar la velocidad de tu hosting con Apache y LiteSpeed.

El archivo .htaccess: el controlador de tráfico de tu servidor web

El archivo .htaccess (HyperText Access) es un archivo de configuración distribuida que Apache y LiteSpeed leen en cada directorio para aplicar reglas específicas sin reiniciar el servidor. Es el mecanismo por el que WordPress, Joomla y la mayoría de CMS manejan URLs amigables, y una herramienta indispensable para redireccionamientos, seguridad y optimización de rendimiento.

⚠️ Siempre haz backup antes de editar .htaccess Un error en .htaccess puede dejar tu sitio completamente inaccesible con un error 500. Antes de cualquier cambio, descarga una copia: en cPanel → File Manager, haz clic derecho en .htaccess → Download. O desde SSH: cp .htaccess .htaccess.bak

Estructura básica y sintaxis

# Comentarios comienzan con #
# Las directivas se aplican al directorio donde está el archivo y subdirectorios

# Activar el motor de reescritura (SIEMPRE la primera línea en WordPress)
RewriteEngine On

# Variables disponibles en RewriteCond:
# %{HTTP_HOST}      → dominio de la solicitud (tudominio.com.mx)
# %{REQUEST_URI}    → ruta solicitada (/blog/articulo)
# %{HTTPS}          → "on" si la conexión es HTTPS
# %{HTTP_USER_AGENT} → user agent del navegador
# %{REMOTE_ADDR}    → IP del visitante
# %{REQUEST_METHOD} → GET, POST, PUT, etc.

Redirecciones 301 y 302: cuándo usar cada una

La diferencia entre 301 y 302 es crítica para el SEO: una redirección 301 transfiere el "link juice" (autoridad de posicionamiento) a la nueva URL. Una 302 indica que el cambio es temporal y Google no transfiere la autoridad.

# Redirección 301 — permanente (usa para cambios definitivos de URL)
Redirect 301 /pagina-vieja.html https://tudominio.com.mx/pagina-nueva/

# Redirección 301 de dominio completo (http → https)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Redirección de www a sin-www (canonicalización)
RewriteCond %{HTTP_HOST} ^www\.tudominio\.com\.mx$ [NC]
RewriteRule ^(.*)$ https://tudominio.com.mx/$1 [R=301,L]

# Redirección de sin-www a www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

# Redirección 302 — temporal (precio en oferta, mantenimiento)
Redirect 302 /mantenimiento https://tudominio.com.mx/sitio-en-construccion.html
🔄
Flujo de redirecciones HTTP: 301 Moved Permanently transfiere autoridad SEO a la nueva URL. 302 Found indica temporalidad, Google mantiene la URL original en el índice.

Redirecciones avanzadas con RewriteRule

# Redirigir un directorio completo
RewriteRule ^blog/(.*)$ /articulos/$1 [R=301,L]

# Redirigir URLs con parámetros GET
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^producto.php$ /productos/%1/? [R=301,L]

# Redirigir extensiones .php a URLs amigables
RewriteRule ^servicios.php$ /servicios/ [R=301,L]
RewriteRule ^contacto.php$ /contacto/ [R=301,L]

# Forzar barra final en URLs (consistencia para SEO)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1/ [R=301,L]

# Bloquear acceso a archivos de backup accidentalmente subidos
RewriteRule \.(sql|bak|old|log|zip|tar|gz)$ - [F,L]

Optimización de rendimiento con .htaccess

# Compresión GZIP (reduce tamaño de transferencia 60-80%)
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/css
  AddOutputFilterByType DEFLATE text/javascript application/javascript
  AddOutputFilterByType DEFLATE application/json application/xml
  AddOutputFilterByType DEFLATE image/svg+xml font/ttf font/woff2
</IfModule>

# Cache del navegador (Browser Caching)
<IfModule mod_expires.c>
  ExpiresActive On
  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 image/webp "access plus 1 year"
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType image/svg+xml "access plus 1 year"
  ExpiresByType image/x-icon "access plus 1 year"
  ExpiresDefault "access plus 1 week"
</IfModule>

Seguridad con .htaccess

# Proteger archivos sensibles
<FilesMatch "(^\.htaccess|wp-config\.php|xmlrpc\.php|readme\.html)$">
  Order Allow,Deny
  Deny from all
</FilesMatch>

# Bloquear inyección SQL y XSS básico en URL
RewriteCond %{QUERY_STRING} (union|select|insert|drop|delete|base64) [NC,OR]
RewriteCond %{QUERY_STRING} (<script|javascript:|vbscript:) [NC]
RewriteRule .* - [F,L]

# Desactivar listado de directorios
Options -Indexes

# Limitar tamaño de uploads (prevenir DoS)
LimitRequestBody 10485760  # 10 MB máximo
💡 Probar .htaccess sin afectar producción Usa la herramienta htaccess tester (htaccess.madewithlove.com) para probar tus reglas antes de subirlas. Pega tu .htaccess y una URL de prueba para ver a qué URL redirecciona antes de hacer cambios en producción.

Escenarios Prácticos: Redirecciones .htaccess en Producción

Escenario 1 — Migración de dominio antiguo a dominio nuevo: Una empresa cambia de marca y necesita redirigir todo el tráfico SEO de marcavieja.com.mx a marcanueva.com.mx preservando el ranking:

# Redirigir dominio completo preservando rutas (SEO-safe 301)
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?marcavieja\.com\.mx$ [NC]
RewriteRule ^(.*)$ https://marcanueva.com.mx/$1 [R=301,L]

# Redirigir HTTP a HTTPS (obligatorio para SEO)
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Redirigir sin www a con www (o viceversa, elegir uno)
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Escenario 2 — Tienda reestructurando URLs de categorías: Las categorías cambian de /categoria/producto a /shop/categoria/producto. Se necesitan redirecciones individuales para no perder el ranking de 200+ URLs:

# Generador de redirecciones masivas desde CSV con Python
import csv
with open('redirects.csv') as f:
    for row in csv.reader(f):
        old, new = row
        print(f"Redirect 301 {old} {new}")

Errores Comunes en Redirecciones .htaccess

ErrorSíntomaCausaSolución
Bucle infinito de redirecciónERR_TOO_MANY_REDIRECTSRegla redirige a sí mismaAgregar condición para no redirigir HTTPS ya activo
301 en lugar de 302 para pruebasNavegador cachea redirect permanenteUsar 301 en desarrolloUsar 302 para redirecciones temporales
Sintaxis incorrectaError 500 en todo el sitioEspacios extra o carácter incorrectoValidar .htaccess con htaccess.madewithlove.com
Redirección cadena largaPérdida de link equity SEOA -> B -> C -> DRedirigir directamente A -> D
Regex incorrectoRedirección no aplicaPatrón RewriteRule erradoProbar regex en regex101.com antes de aplicar

Preguntas Frecuentes sobre .htaccess en México

¿Qué diferencia hay entre 301 y 302?

301 (Moved Permanently): le dice a Google que la página se movió definitivamente. El motor de búsqueda transfiere el link equity (~90-99%) a la URL nueva y actualiza su índice. 302 (Found/Temporary): indica que el movimiento es temporal; Google mantiene la URL original en el índice. Usa 301 para cambios permanentes de URL y 302 para redirecciones temporales (mantenimiento, A/B testing).

¿El archivo .htaccess afecta el rendimiento?

Sí, cuando AllowOverride está habilitado. Apache lee el .htaccess en cada petición buscando reglas aplicables, lo que agrega latencia. Para minimizar el impacto: 1) Mueve las reglas que no cambian al archivo de configuración del VirtualHost. 2) Usa AllowOverride None donde no necesitas .htaccess. En LiteSpeed, el impacto es menor porque cachea las reglas .htaccess internamente.

¿Cómo redirigir una sola página sin afectar el resto?

Usa Redirect o RedirectMatch para rutas específicas, no RewriteRule: Redirect 301 /pagina-vieja https://tudominio.com/pagina-nueva Esta directiva es más simple y más rápida que RewriteRule para casos de URLs fijas sin patrones. Para redirecciones masivas en WordPress, el plugin "Redirection" gestiona las reglas desde el panel admin sin editar .htaccess manualmente.

¿Cómo verifico que mis redirecciones funcionan?

Desde terminal: curl -I https://dominio.com/url-vieja y verifica que la respuesta sea HTTP/1.1 301 Moved Permanently con el Location: correcto. También usa la herramienta "Redirect Checker" online o Google Search Console: el reporte de Cobertura mostrará URLs redireccionadas. Verifica que las redirecciones en cadena (A→B→C) se simplifiquen a directas (A→C).

¿Puedo usar .htaccess en servidores Nginx?

No. Nginx no procesa archivos .htaccess. Las reglas equivalentes van en el bloque server del archivo de configuración de Nginx (generalmente en /etc/nginx/conf.d/tudominio.conf). Herramientas como Winginx pueden convertir reglas .htaccess a sintaxis Nginx, pero siempre revisa manualmente el resultado ya que la conversión automática no es perfecta.

👨‍💻
Juan Vaca Cloud Infrastructure Expert & Founder de VacaWeb

Fundador de VacaWeb con más de 15 años administrando infraestructura Linux en producción. Especialista en LiteSpeed, CloudLinux, cPanel/WHM y arquitectura de hosting de alto rendimiento para el mercado mexicano. Ha diseñado y migrado la infraestructura de más de 1,200 sitios web empresariales.

Compartir: