Redirecciones 301 y 302: cómo implementarlas en PHP, .htaccess y Laravel
Si llevas un tiempo trabajando desarrollando Webs, seguro que más de una vez te has encontrado con la necesidad de redirigir al usuario de una URL a otra. Puede ser porque cambiaste la estructura de rutas, porque migraste contenido, o simplemente porque necesitas una redirección temporal mientras terminas algo.
El problema es que no todas las redirecciones son iguales, y usar la incorrecta puede tener consecuencias tanto en el SEO como en el comportamiento de tu aplicación.
Vamos a ver qué diferencia hay entre una redirección 301 y una 302, cuándo usar cada una, y cómo implementarlas tanto de forma tradicional como en Laravel.
¿Qué diferencia hay entre una redirección 301 y una 302?
Antes de entrar en código, merece la pena entender bien la diferencia porque afecta directamente a cómo los buscadores tratan tus URLs.
La redirección 301 indica que el cambio es permanente. Google y el resto de buscadores entienden que la URL A ha desaparecido para siempre y que deben indexar la URL B en su lugar. Además, el peso SEO que acumulaba la URL antigua se transfiere a la nueva.
La redirección 302 indica que el cambio es temporal. El buscador mantiene indexada la URL original porque sabe que en algún momento volverá a estar activa. El peso SEO no se transfiere.
Error habitual: Yo me he encontrado muchas veces con desarrolladores que usan 302 por defecto simplemente porque "funciona", sin pensar en las implicaciones. Si el cambio es permanente y usas una 302, estás dejando valor SEO sobre la mesa sin ningún motivo.
¿Cuándo usar cada una?
Usa una redirección 301 cuando:
- Cambias la estructura de URLs de tu aplicación de forma definitiva (por ejemplo, pasas de
/blog/post-tituloa/articulos/post-titulo). - Migras el contenido de un dominio a otro.
- Quieres evitar contenido duplicado. Por ejemplo, si tu home es accesible tanto en
midominio.comcomo enmidominio.com/index, una 301 de la segunda a la primera le deja claro a Google cuál es la URL canónica. - Cambias el dominio del proyecto por cualquier motivo.
- Formas el uso de https. Redirigir el tráfico que llegue al dominio a través de
http://ahttps://. Ten encuenta que a ojos de Googlehttp://midominio.comyhttps://midominio.comson dos urls distintas. - Forzar el uso en el dominio de las tres www o no. Como en en caso anterior,
https://midominio.comyhttps://www.midominio.comson dos urls distintas a ojos de Google.
Usa una redirección 302 cuando:
- Tienes una página en mantenimiento y quieres redirigir temporalmente a una página de aviso.
- Estás haciendo pruebas A/B entre dos versiones de una página.
- Una sección de tu app está desactivada temporalmente y vas a reactivarla más adelante.
Cómo hacerlo de forma tradicional
Antes de ver cómo lo resuelve Laravel, vale la pena conocer los métodos clásicos.
Si trabajas en proyectos sin framework, o simplemente tienes que tocar un servidor Apache directamente, estas son las dos formas más habituales.
Mediante el archivo .htaccess
El archivo .htaccess es un fichero de configuración de Apache que vive en el directorio raíz de tu proyecto.
Es el método más usado para gestionar redirecciones a nivel de servidor, y funciona sin necesidad de tocar ningún archivo PHP.
Para una redirección 301 de una URL concreta a otra, añades esta línea:
Redirect 301 /url-antigua.html https://www.midominio.com/url-nueva/
Si lo que necesitas es redirigir todo el tráfico de un dominio antiguo a uno nuevo manteniendo la estructura de URLs, puedes usar mod_rewrite:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^dominio-antiguo\.com [NC]
RewriteRule ^(.*)$ https://www.dominio-nuevo.com/$1 [R=301,L]
Y si lo que buscas es forzar HTTPS en todo el sitio, que es algo que deberías tener siempre activado, la redirección quedaría así:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Importante: El archivo .htaccess solo funciona en servidores Apache. Si tu servidor corre Nginx, este fichero no tiene ningún efecto y tendrás que configurar las redirecciones directamente en el bloque server del archivo de configuración de Nginx.
Mediante PHP puro con header()
Si no tienes acceso al .htaccess o trabajas con un script PHP suelto, puedes hacer la redirección directamente desde el código usando la función header().
La clave aquí es que la llamada a header() tiene que hacerse antes de que se envíe cualquier salida al navegador: sin espacios, sin HTML, sin nada antes.
Para una redirección 301:
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://www.midominio.com/url-nueva/");
exit();
Para una redirección 302:
<?php
header("HTTP/1.1 302 Found");
header("Location: https://www.midominio.com/url-temporal/");
exit();
No olvides el exit(): Después de enviar la cabecera de redirección es imprescindible llamar a exit() para detener la ejecución del script. Si no lo haces, PHP seguirá procesando el resto del código aunque el navegador ya haya recibido la orden de redirigir.
Cómo implementarlas en Laravel
Una vez que entiendes cómo funcionan las redirecciones a bajo nivel, verás que Laravel simplemente te abstrae toda esa complejidad con una API mucho más cómoda. Vamos a ver las distintas opciones.
Redirección directa desde routes/web.php
Si necesitas una redirección permanente y no tienes que pasar por ningún controlador, puedes declararla directamente en el archivo de rutas. Es la opción más sencilla y la que yo uso cuando migro URLs antiguas:
// Redirección 301 (permanente)
Route::redirect('/url-antigua', '/url-nueva', 301);
// Redirección 302 (temporal) — es el valor por defecto
Route::redirect('/url-antigua', '/url-nueva');
// Helper específico para permanentes
Route::permanentRedirect('/url-antigua', '/url-nueva');
Redirección desde un controlador
Cuando la redirección depende de alguna lógica, la gestionas desde el controlador usando el helper redirect():
// Redirección básica
return redirect('/nueva-url');
// Redirección 301 permanente
return redirect('/nueva-url', 301);
// Redirección a una ruta nombrada
return redirect()->route('nombre.ruta');
// Redirección con parámetros
return redirect()->route('post.show', ['slug' => $post->slug]);
// Volver a la página anterior
return redirect()->back();
// Volver con datos de sesión (útil tras validación de formularios)
return redirect()->back()->withInput()->withErrors($validator);
Redirección con mensaje flash
Una cosa que uso bastante es encadenar un mensaje flash a la redirección para mostrar una notificación en la página de destino:
return redirect()->route('dashboard')
->with('success', 'Los cambios se han guardado correctamente.');
Luego en tu vista simplemente compruebas si existe la clave en la sesión:
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
Gestionar redirecciones masivas de URLs antiguas
Si has migrado de otro CMS o has reestructurado toda la aplicación y tienes decenas —o cientos— de URLs que redirigir, añadirlas una a una en routes/web.php se vuelve inmanejable. En ese caso yo opto por gestionarlas desde un middleware que consulta una tabla en base de datos.
// app/Http/Middleware/HandleRedirects.php
public function handle(Request $request, Closure $next)
{
$redirect = DB::table('redirects')
->where('origin', $request->path())
->first();
if ($redirect) {
return redirect($redirect->destination, $redirect->status_code);
}
return $next($request);
}
Estructura de la tabla: La tabla redirects necesita al menos tres columnas: origin, destination y status_code. Así puedes gestionar todas las redirecciones desde la base de datos sin tocar el código cada vez que añadas una nueva.
Un aviso sobre las redirecciones y el SEO
Nunca hagas redirecciones con JavaScript o con etiquetas meta refresh si quieres que los buscadores las sigan correctamente. Los bots de Google pueden interpretarlas, pero no están obligados a seguirlas de la misma manera que una redirección HTTP estándar.
Siempre que puedas, gestiona tus redirecciones a nivel de servidor: desde el .htaccess, desde PHP, o desde Laravel si es tu caso. Son las únicas formas que garantizan que Google las va a interpretar exactamente como tú quieres.
Como ves, gestionar redirecciones no tiene ningún misterio, sea cual sea el entorno en el que trabajes.
La clave está en elegir bien entre 301 y 302 según si el cambio es permanente o temporal, y aplicarla a nivel de servidor, no con trucos de frontend.
Si trabajas con Laravel, el framework ya te da todas las herramientas para hacerlo de forma limpia y sin tener que tocar un solo archivo de configuración del servidor.
Comentarios (0)
Deja un comentario
Tu dirección de correo no será publicada. Los campos obligatorios están marcados con *