La mejor forma de hacer una redirección

Los sitios web van y vienen… y como no queremos perder información ni generar un montón de errores en la red de redes, lo mejor es poder migrar información de un sitio a otro fácilmente.

Y como ya comenté una vez, el 302 no es una redirección, sino que lo son el 301 y 307, por lo que si queremos migrar todo lo relacionado a un sitio, deberemos aplicar una de estas, en este caso, la redirección 301.

Hay que partir de la base de que las redirecciones en HTML (a pelo) no funcionan, al menos no para lo que nosotros queremos. Esto significa que hacer una redirección con el meta-refresh o a través de JavaScript no sirven para migrar contenidos o pesos, sino que el usuario cambia de “página vista” a un nuevo lugar. Hay que tener en cuenta que esto se ha usado tiempo atrás como método de spam, así que hay muchas posibilidades de que los buscadores consideren tu sitio un poco indeseable.

En estos casos en los que no disponemos de un sistema para generar redirecciones 301 programadas lo mejor es utilizar el sistema de “rel=canonical” que propuso Google y el resto de buscadores y que, en algunos casos, se puede usar para redirigir tráfico entre dominios.

¿Se puede utilizar rel=”canonical” para sugerir una URL canónica de un dominio completamente distinto?

Existen situaciones en las que no resulta fácil configurar los redireccionamientos. Así ocurre, por ejemplo, cuando hay que realizar una migración a un nuevo nombre de dominio a través de un servidor web que no puede crear redireccionamientos de servidor. En esos casos se puede utilizar el elemento de enlace rel=”canonical” para especificar la URL exacta del dominio que se prefiere para la indexación. Aunque el elemento de enlace rel=”canonical” se considera una sugerencia y no una directiva incuestionable, intentamos seguirlo siempre que es posible.

Básicamente sería incluir en el “head” de cada una de las páginas a redireccionar algo como:

<link rel="canonical" href="http://www.nuevodominio.com/nueva-carpeta/nuevo-fichero.html">

En el caso en el que sí que tengamos acceso al menos al servidor Apache, aunque no tengamos un lenguaje de programación para hacerlo, es utilizar el .htaccess del servidor. Por norma general, debería de funciona, aunque si tu proveedor de Internet es un poco rata puede que no te sirva mucho…

En este caso tenemos un par de opciones… la más sencilla sería esta…

Redirección 301 usando .htaccess

Redirect 301 /vieja-carpeta/viejo-fichero.html http://www.nuevodominio.com/nueva-carpeta/nuevo-fichero.html

Otra opción es usar el mod_rewrite, también del .htaccess y que en este caso usaríamos, por ejemplo, para controlar si el sitio tiene o no las www.

Redirección 301 usando mod_rewrite

RewriteEngine On
RewriteCond %{http_host} ^nuevodominio.com
RewriteRule ^(.*) http://www.nuevodominio.com/$1 [R=301,L]

En el caso de querer hacerlo con Internet Information Server (IIS) podemos seguir estos pasos…

Redirección 301 usando Internet Information Server (IIS)

  • En el Internet Services Manager, hacer botón derecho en el fichero o carpeta a redireccionar.
  • Seleccionar la opción: redireccionar a una URL.
  • Añadir la dirección URL de destino
  • Seleccionar la opción URL exacta y redirección permanente.
  • Pulsar en Aplicar / OK

Si trabajamos con alguno de los siguientes lenguajes de programación, suele ser bastante sencillo, aunque se puede complicar según queramos hacerlo más o menos extensible. Por ejemplo:

Redirección 301 usando ASP

<%@ Language=VBScript %>
<%
Response.Status="301 Moved Permanently"
Response.AddHeader "Location", "http://www.nuevodominio.com/"
%>

Redirección 301 usando ASP.net

<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location","http://www.nuevodominio.com/");
}
</script>

Redirección 301 usando ColdFusion

<cfheader statuscode="301" statustext="Moved permanently">
<cfheader name="Location" value="http://www.nuevodominio.com/">

Redirección 301 usando Java

<%
response.setStatus(301);
response.setHeader("Location", "http://www.nuevodominio.com/");
response.setHeader("Connection", "close");
%>

Redirección 301 usando Perl

$q = new CGI;
print $q->redirect(" http://www.nuevodominio.com/ ");

Redirección 301 usando PHP

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.nuevodominio.com/");
exit;
?>

Redirección 301 usando Ruby o Ruby on Rails

head :moved_permanently, :location => "http://www.nuevodominio.com/

De todas formas, estas redirecciones mandarían cualquier página a la principal, y no a la correspondiente. para eso, por ejemplo en PHP, se podría hacer algo como esto:

<?php
header("HTTP/1.1 301 Moved Permanently");
$accion = "Location: http://www.nuevodominio.com".$_SERVER["REQUEST_URI"];
header($accion);
?>

En este caso se incluye la variable de servidor REQUEST_URI que lleva toda la dirección URL exceptuando el dominio…

Y con esto un minicursillo de redirecciones en muchos lenguajes de programación distintos… al menos espero que a alguien le sirva para tener un punto de inicio si necesita migrar un dominio y no quiere perder todo el trabajo que haya podido hacer históricamente en él.

3 comentarios en “La mejor forma de hacer una redirección”

  1. Y cuando esto le ocurre al mover de un hosting a otro, sobre todo el movimiento de archivos, cual seria tu recomendación?

    Gracias

  2. A ver, si cambias de hosting en principio no hay que hacer nada… simplemente tener en cuenta que el cambio de DNS tarda cierto tiempo, y que hay que “impedir” de alguna manera que un usuario pueda actualizar la información y/o ficheros del servidor antiguo, porque se perderán al cambiar al nuevo.

  3. Hola Javier!! Qué tal?
    Estoy optimizando mi página a full :D pero me he encontrado con un problema, se que para imágenes, js, css es bueno utilizar un subdominio para cargas en paralelo. Pero el problema es que google ya me ha enlazado 10.000 páginas de contenido con dicho subdominio. Crees que es mejor hacer una redirección 301 o mostrarle el canonical ? Sino lo interpretará como contenido duplicado, no?

    Saludos y geracias!!!

Deja un comentario