Canonicalizacion con PHP
Si tu web está alojada en un servidor que no tiene mod_rewrite habilitado, no puedes usar htaccess para canonicalizar el dominio (Ej. redirigir http://ejemplo.com a http://www.ejemplo.com).
La solución es insertar el siguiente código en el header antes de cualquier otro código PHP o HTML.
<?php
$redirect = false;
$path = $_SERVER['REQUEST_URI'];
$url = $_SERVER['HTTP_HOST'];
if ($url != 'www.ejemplo.com') {
$redirect = true;
}
if ($redirect==true){
header(’HTTP/1.1 301 Moved Permanently’);
header(’Location: http://www.ejemplo.com’ .$path);
}
?>
Obviamente hay reemplazar “www.ejemplo.com” con el dominio de tu web.





Muchas gracias David, este código es muy útil. ¿Nos podrías decir cuáles son las ventajas de la canonicalización, por favor?
[...] suscribete por email o por RSS. ¡Gracias por tu visita!.El otro día escribí sobre cómo canonicalizar los dominios con PHP. Ahora toca hacer lo mismo con ASP. De hecho, este código ASP puede ser mucho más práctico que [...]
[...] pero si quieres mostrarles a los lectores de tu blog algún tipo de código como el código para canonicalizar las URLs con PHP, estas comillas que Wordpress crea automáticamente acaban siendo como un grano en el [...]
Con este código conseguimos que todas las URLs del tipo http: //ejemplo.com/lo-que-sea sean http ://www.ejemplo.com/lo-que-sea.
Pero si también se quiere contemplar el caso de http ://www.ejemplo.com/index.php o http ://ejemplo.com/index.php se redirija a http ://www.ejemplo.com/ hay que poner alguna cosa más. Así que he modificado un poco este código con lo que el resultado ha sido éste:
$redirect = false;$path = $_SERVER['REQUEST_URI'];
$url = $_SERVER['HTTP_HOST'];
if ($url != 'www.ejemplo.com' || $path == '/index.php') {
$redirect = true;
}
if ($redirect==true){header('HTTP/1.1 301 Moved Permanently');
if ($path == "/index.php") {
header('Location: http ://www.ejemplo.com');
} else {
header('Location: http ://www.ejemplo.com' .$path);
}
}
¡Espero que os sirva!
Todavía mejor.
- Canonicaliza el host: de www .example.com/loquesa a example.com/loquesea y viceversa.
- Canonicaliza el path: de host/loquesea/index.php a host/loquesa/. Por supuesto también de host/index.php a host/
< ?php
$target_host = "www .example.com"; // www .example.com or example.com
$redirect = false;
$path = $_SERVER['REQUEST_URI'];
$host = $_SERVER['HTTP_HOST'];
// Checking hostif ($host != $target_host) {
$redirect = true;
$host = $target_host;
}
$url = $host.$path;
// Checking path$pattern = "^(.*)(/index\.php)$^";
preg_match_all($pattern, $url, $match);
if ($match[0][0] != "") {
$redirect = true;
$url = $match[1][0] . "/";
}
// Redirectif ($redirect){
header('HTTP/1.1 301 Moved Permanently');
header('Location: http ://'.$url);
}
?>
Utilizo éste último código que pegaste Sara y me funciona de maravilla, pero como logro quitar la barra / al final??
Saludos y gracias
Que yo sepa, solo se puede quitar la barra con mod_rewrite. No se me ocurre ninguna manera de conseguirlo con PHP. De todas formas, lo investigo y si encuentro una solcución con PHP, la publicaré aquí.
Hola que tal, cuando los usuarios cierran sesión en mi web, los mando a /index.php?CerrarSesion=Salir , como puedo hacer la redirección 301 para mandarlos a /index.php ??
Saludos
Hola Chema, pues todo depende de como lo tengas programado. De todas maneras Google llega alguna vez al enlace /index.php?CerrarSesion=Salir? es decir, lo ha llegado a indexar?
Sino se me ocurre algo tan sencillo como poner un rel=nofollow en el enlace de cerrar sesión. Por lo que me cuentas con esto bastará.
Estupendo este código! Me viene de perlas…
En un portal Joomla, si quieres integrar aplicaciones de terceros, como Coppermine, foros, etc, hay que canonicalizar la url, si no, es imposible que la validación de usuario funcione bien entre aplicaciones. Así que de nuevo gracias por el aporte!