Cuando tienes que hacer cambios en URLs o migraciones de WordPress siempre hay que tener un especial cuidado en no perder el posicionamiento SEO de las URLs anteriores.
Da igual cuál vaya a ser el cambio, de una sola URL o de un dominio completo, es vital que, si tenías ya una URL bien posicionada en Google o el resto de buscadores, tras el cambio de URLs los enlaces posicionados no lleven a una página de error 404, sino a la nueva URL.
Para este objetivo no hay nada mejor que conocer las reglas de redirección 301, o redirección permanente, que debemos añadir al archivo .htaccess
del servidor para conseguir mantener el SEO de las URLs antiguas, que este se traspase a las nuevas, y que no lleven a páginas de error.
Nota importante: Haz siempre copia de seguridad del archivo .htaccess antes de aplicar cualquier redirección nueva, y si tras guardar los cambios tu web da algún error recupera la copia de seguridad y habla con tu proveedor de hosting para preguntarles por qué no te ha funcionado la redirección, por si tuviesen alguna limitación por su parte.
Nota: En los ejemplos de redirecciones cambia siempre los dominios de ejemplo por los tuyos.
Índice de contenidos
Redirección 301 de URLs sin www a URLs con www
Si quieres forzar que las URLs de tu dominio, anteriormente sin www, se conviertan en URLs con www, añade lo siguiente al archivo .htaccess del servidor donde esté alojado tu dominio.
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] </IfModule>
Redirección 301 de URLs con www a URLs sin www
El ejemplo contrario, para no usar las www, sería así:
<IfModule mod_rewrite.c> # Redirigir de www a no www RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] </IfModule>
Redirección 301 de URLs HTTP a URLs HTTPS
Si acabas de instalar un certificado SSL para tu web es fundamental que redirijas todas las peticiones HTTP a HTTPS, así:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] </IfModule>
Redirección 301 de URLs HTTPS a URLs HTTP
Si tu situación es la contraria, que has decidido no servir con HTTPS, lo que deberías añadir sería esto otro:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{SERVER_PORT} ^443$ RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] </IfModule>
Redirección 301 de un dominio a otro
Esta situación es quizás la más buscada, cuando haces un cambio de dominio por algún motivo. En este caso debes añadir lo siguiente al archivo .htaccess
de la instalación del dominio antiguo.
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ https://nuevodominio.com/$1 [R=301,L]
</IfModule>
Esto significa, además, que no debes dar de baja ni borrar el alojamiento donde esté el dominio anterior, o dejará de funcionar la redirección 301. Eso sí, puedes borrar toda la instalación de WordPress y archivos, así como el resto de reglas previas en el .htaccess
del dominio anterior, la única que importa normalmente ya será esta, la redirección al nuevo dominio.
¿Cuánto tiempo deberías dejarlo activo? Pues, a modo de ejemplo extremo, yo hace como 5 años que redirigí el dominio ciberprensa.com a tellado.es, y aún mantengo el alojamiento (mínimo) asociado a ciberprensa.com con la redirección. Igual es demasiado tiempo, y ya podría anular el alojamiento, pero no me pide pan y con los designios de Google prefiero no arriesgar.
Pero bueno, quizás es exagerar un poco. La idea es que vigiles el cambio de dominio, y cuando ya no veas en tus búsquedas habituales de tu contenido resultados con el dominio anterior, y veas que estos han sido sustituidos por resultados con el nuevo dominio, ya podrías anular el alojamiento donde estuviese el dominio anterior, y dejar solamente una redirección directa de dominio a dominio desde el hosting, sin tener que mantener ningún alojamiento.
Para finalizar, aunque Google va a recoger sin problema los cambios de URL tras un cambio de dominio, y ya hace tiempo que anunció que no se pierde PageRank al cambiar de dominio si se hace una correcta redirección 301, puede ayudar que uses su herramienta de cambio de dominio para hacer seguimiento desde la Search Console.
Redirección 301 de un subdominio a un dominio
Aquí debes hacer lo mismo que en el ejemplo anterior, en este caso en el archivo .htaccess donde esté el subdominio:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ https://nuevodominio.com/$1 [R=301,L]
</IfModule>
Redirección 301 de una carpeta a un dominio
Exactamente igual que en los 2 casos anteriores, la instalación de origen no importa, funciona igualmente, lo importante es indicar a dónde debe hacerse la redirección 301:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ https://nuevodominio.com/$1 [R=301,L]
</IfModule>
Redirección 301 de dominio a subdominio
Ahora vamos a ponernos en el caso contrario, en que tras años pagando por un dominio hayas decidido que mejor quieres tu instalación en un subdominio. Pues bien, tras mover toda tu instalación, en el archivo .htaccess del dominio anterior añade lo siguiente:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ https://subdominio.midominio.com/$1 [R=301,L]
</IfModule>
Redirección 301 de dominio a subcarpeta
Y lo mismo sería si has decidido mover tu contenido a una subcarpeta en un dominio:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ https://midominio.com/mi-carpeta/$1 [R=301,L]
</IfModule>
Redirección 301 de subdominio a subcarpeta
Un ejemplo algo diferente sería cambiar de subdominio a subcarpeta. En este caso sería de este modo:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^(.*)$ https://midominio.com/mi-carpeta/$1 [L,NE,R=301]
</IfModule>
Redirección 301 de una página a otra
Estas redirecciones son las más habituales en cualquier web, WordPress o no, pues sirven para redirigir el tráfico de una entrada o página a otra cuando borramos, queda obsoleta, o lo que sea, la primera. Se hacen así:
<IfModule mod_rewrite.c> RewriteEngine On Redirect 301 /mi-pagina-anterior/ /mi-nueva-pagina/ </IfModule>
Otro modo de hacer estas redirecciones, exactamente igual de efectivo que el anterior, sería así:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^mi-pagina-anterior/$ https:/midominio.com/mi-nueva-pagina/ [R=301,L] </IfModule>
Si vas a crear varias redirecciones de este tipo no es necesario que añadas IfModule y RewriteEngine On para cada una, basta con hacerlo una sola vez, como en este ejemplo:
<IfModule mod_rewrite.c> RewriteEngine On Redirect 301 /mi-pagina-anterior/ /mi-nueva-pagina/ Redirect 301 /mi-otra-pagina-anterior/ /mi-otra-nueva-pagina/ </IfModule>
Y con el otro método exactamente igual:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^mi-pagina-anterior/$ https:/midominio.com/mi-nueva-pagina/ [R=301,L] RewriteRule ^mi-otra-pagina-anterior/$ https:/midominio.com/mi-otra-nueva-pagina/ [R=301,L] </IfModule>
Y así sucesivamente.
Nota importante: Si vas a hacer muchas redirecciones de entradas o páginas, mejor que uses un plugin como Redirection. Te evitarás tener que estar editando el archivo .htaccess y posibles errores de tecleo, y además el plugin puede hacer redirecciones automáticamente por ti cuando hagas un cambio de slug.
Redirección 301 de URLs con día y nombre a URLs solo con el nombre
Esto es muy habitual en sitios que han migrado de WordPress.com a WordPress, pues en el servicio de blogs de Automattic las URLs por defecto son con día nombre (/%year%/%monthnum%/%day%/%postname%/
) , y no se pueden cambiar en la mayoría de los planes.
En cualquier caso, si has cambiado los enlaces permanentes de día y nombre (/%year%/%monthnum%/%day%/%postname%/
) a solo el nombre (%postname%
) debes añadir lo siguiente para no perder posicionamiento:
RedirectMatch 301 ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/(?!page/)(.+)$ https://midominio.com/$4
Redirección 301 de URLs con mes y nombre a URLs solo con el nombre
Si los enlaces permanentes anteriores eran del tipo de mes y nombre (/%monthnum%/%day%/%postname%/
), y has cambiado a solo nombre (%postname%
), entonces debes añadir esto otro:
RedirectMatch 301 ^/([0-9]{4})/([0-9]{2})/(?!page/)(.+)$ https://midominio.com/$3
Redirección 301 de URLs numéricas a URLs solo con el nombre
Si tenías los enlaces permanentes numéricos (/archivos/%post_id%
) y quieres que tengan solo el nombre (%postname%
) entonces esta es la redirección:
RedirectMatch 301 ^/archivos/(\d+)$ https://midominio.com/?p=$1
Redirección 301 de URLs simples a URLs con nombre
Esta redirección no es necesaria, pues las URLs simples de WordPress (?p=123
) siempre redirigirán a la estructura de enlaces permanentes activa actualmente, sea la que sea.
Redirección 301 de URLs con la categoría y el nombre a URLs solo con el nombre
Si en algún momento creaste enlaces permanentes personalizados, que incluyesen la categoría en la URL (/%category%/%postname%/
), algo muy habitual dicho sea de paso, y en algún momento vuelves a las URLs solo con el nombre (%postname%
), deberías añadir una redirección 301 para no arruinar tu SEO, así:
RedirectMatch 301 ^/<category>/(.*)$ https://midominio.com/$1
Redirección 301 de URLs sin barra final (/) a URLs con barra final
Esto pasa cuando quieres redirigir todas las URLs de una web con barra al final a URLS sin la barra al final.
Se haría así:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] </IfModule>
Todas las URLs del tipo https://midominio.com/mi-entrada/
pasarían a ser https://midominio.com/mi-entrada
Redirección 301 de URLs con barra final (/) a URLs sin barra final
Si tu caso es justamente el contrario, lo que tendrías que añadir sería lo siguiente:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*[^/])$ /$1/ [L,R=301] </IfModule>
Aquí consigues todo lo contrario, que todas las URLs https://midominio.com/mi-entrada
pasen a ser https://midominio.com/mi-entrada/
Redirección de URLs con extensión a URLs sin extensión
Imagina que en su momento decidiste añadir una extensión a los enlaces permanentes de tu web, por ejemplo .htm
, pero luego te arrepientes y quieres quitar las extensiones, pero sin perder el SEO conseguido.
U otro ejemplo, que vas a redirigir todas las URLs de una web HTML simple, todas con extensión .html
, a URLs creadas con WordPress, sin extensión.
Si es lo que necesitas, un ejemplo del código, si provienen de la extensión .html
, sería así:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/?(.*).(html)$ /$1 [R=301,L] </IfModule>
Todas las URLs como https://midominio.com/mi-entrada.html
pasarían a ser https://midominio.com/mi-entrada
Otro ejemplo, en este caso si las URLs terminan en .php, típico de instalaciones de otros CMS, sería así:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/?(.*).(php)$ /$1 [R=301,L] </IfModule>
Redirección 301 de URLs AMP a URLs no AMP
Si hace poco has decidido desactivar AMP de tu web, es vital que añadas la siguiente redirección 301 de tus URLs AMP a las URLs no AMP:
RewriteEngine On RewriteCond %{REQUEST_URI} (.+)/amp(.*)$ RewriteRule ^ %1/ [R=301,L] RewriteCond %{QUERY_STRING} ^(.*)?amp=1$ RewriteRule (.*) /$1? [R=301,L]
Redirección 301 de URLs en mayúsculas a URLs en minúsculas
Seguro que ya sabrás que los servidores web distinguen entre mayúsculas y minúsculas ¿verdad?
O sea, que para un servidor, y tu navegador, no es lo mismo la URL https://midominio.com/MI-ENTRADA/
que la URL https://midominio.com/mi-entrada/
.
Pues bien, te puedes encontrar en la situación de haber tenido que cambiar URLs con mayúsculas a URLs con minúsculas, en cuyo caso deberías forzar redirecciones permanentes (301) de las viejas URLs con mayúsculas a las nuevas URLs en minúsculas.
Esto es lo que debes añadir a tu archivo .htaccess
:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1] RewriteRule ![A-Z] - [S=28] RewriteRule ^([^A]*)A(.*)$ $1a$2 RewriteRule ^([^B]*)B(.*)$ $1b$2 RewriteRule ^([^C]*)C(.*)$ $1c$2 RewriteRule ^([^D]*)D(.*)$ $1d$2 RewriteRule ^([^E]*)E(.*)$ $1e$2 RewriteRule ^([^F]*)F(.*)$ $1f$2 RewriteRule ^([^G]*)G(.*)$ $1g$2 RewriteRule ^([^H]*)H(.*)$ $1h$2 RewriteRule ^([^I]*)I(.*)$ $1i$2 RewriteRule ^([^J]*)J(.*)$ $1j$2 RewriteRule ^([^K]*)K(.*)$ $1k$2 RewriteRule ^([^L]*)L(.*)$ $1l$2 RewriteRule ^([^M]*)M(.*)$ $1m$2 RewriteRule ^([^N]*)N(.*)$ $1n$2 RewriteRule ^([^O]*)O(.*)$ $1o$2 RewriteRule ^([^P]*)P(.*)$ $1p$2 RewriteRule ^([^Q]*)Q(.*)$ $1q$2 RewriteRule ^([^R]*)R(.*)$ $1r$2 RewriteRule ^([^S]*)S(.*)$ $1s$2 RewriteRule ^([^T]*)T(.*)$ $1t$2 RewriteRule ^([^U]*)U(.*)$ $1u$2 RewriteRule ^([^V]*)V(.*)$ $1v$2 RewriteRule ^([^W]*)W(.*)$ $1w$2 RewriteRule ^([^X]*)X(.*)$ $1x$2 RewriteRule ^([^Y]*)Y(.*)$ $1y$2 RewriteRule ^([^Z]*)Z(.*)$ $1z$2 RewriteRule [A-Z] - [N] RewriteCond %{ENV:HASCAPS} TRUE RewriteRule ^/?(.*) /$1 [R=301,L] </IfModule>
Bonito ¿eh?
Estas reglas de redirección son las más habituales, pero si sabes alguna más que sea interesante cuéntanoslo en los comentarios y la añado a la lista 🙂
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!
Gracias Fernando,
Uso el plugin Rank Math SEO, y tengo activadas las redirecciones, incluyendo que, las páginas o artículos sin redirección los lleve a la página de inicio. ¿Es correcto? Gracias.
Un saludo Fernando.
Gracias por tanta información, y gracias por tu libro… que está siempre en mi mesita de noche. 🙂
Tengo la siguiente situación:
– Tienda basada en Woocommerce con 2 años de antigüedad. Ahora con un posicionamiento más o menos decente.
– La tienda está basada en una sola marca y la estructura de las URL de producto actual es: https://midominio.com/marca/producto/
– Otra marca me propone vender sus productos y, obviamente, la estructura descrita no me sirve y quisiera cambiarla por: https://midominio.com/tienda/producto/
– ¿Sería correcta esta redirección?: Redirect 301 /marca/ https://midominio.com/tienda/
Mil gracias por tu tiempo.
Javier
Y mi pregunta es ¿por qué no te valen los permalinks originales?, yo los veo totalmente lógicos, más ahora que habrá una única tienda para varias marcas, o sea
midominio.com/marca/mimarca/producto-equis
midominio.com/marca/otramarca/producto-otro
Dicho esto, la redirección correcta sería más así:
Fernando, mil gracias por tu tiempo.
Te explico…
En su día, en Ajustes > Enlaces permanentes > Enlaces permanentes del producto marqué la opción ‘Base personalizada’ y puse ‘/marca/’.
No pensaba que iba a crecer o interesar a nadie, y ahora no quiero perder todo el posicionamiento orgánico que me ha costado más de dos años de trabajo.
¿Cómo lo ves?
Gracias de nuevo.
Javier
Buenas noches Fernando,
Te quiero hacer una consulta,
Si tienes que cambiar de dominio casi 200.000 links que se encuentran en un subominio y moverlos al dominio root. Cual es la manera más eficiente de no perder linkjuice en este proceso?
Muchísimas gracias por tu orientación.
Una redirección 301
Muchas gracias Fernando!,
Saludos desde Colombia!;
¡Hola Fernando!
Muy interesante la entrada 🙂
Yo no soy tan avanzada para hacer estas redirecciones, así que las hago con un plugin «redirection». De hecho, ahora quiero eliminar «categorías de producto» que ya no voy a usar en mi tienda y, no me atrevo sin antes saber si también tengo que hacer redirecciones de estas categorías que voy a eliminar de WooCommerce… ¿Debo hacer redirecciones 301 como las hago de los productos que elimino y no voy a vender más o están descatalogados?, y, en el caso de tener que hacerlas, ¿las redirijo a la URL de la home?
Muchas gracias de antemano y enhorabuena por todo el trabajo que compartes.
¡Saludos!