redirección
Redireción de un dominio a otro con urls diferentes
Carlos — Vie, 10/10/2008 - 13:36
En Ama Tu Salud, una de las webs hecha con Drupal y Ubercart que estamos a punto de publicar, queremos pasar la web del .com a un .es (la web se llama igual) para no perder el posicionamiento que ya tiene.
Por ejemplo queremos que
http://www.amatusalud.com/product_info.php?products_id=163 redireccione a
http://www.amatusalud.es/producto/stabilium-200
Esto se podría hacer con un mod_rewrite con una línea a mano por cada redirección (ya que no siguen un patrón común que pueda usar) pero por algún motivo no he logrado hacerlo bien. Lo que yo usaba era:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^amatusalud.com [NC]
RewriteRule ^product_info.php?products_id=163$ http://www.amatusalud.es/producto/stabilium-200 [L,R=301]
Con esto he probado mil cosas,, ponerle una / al principio de la url, quitarle la condición, cambiar el destino y poner uno del .com (bueno, mil cosas no han sido)
Pero cómo ya he comentado no me ha funcionado (algo debe estar mal). De todas maneras esto tenía el problema de que dependiendo de las redirecciones el .htaccess se puede hacer demasiado largo aunque tampoco tengo muy claro que grave podría ser esto.
Cómo alternativa propusieron gestionarlo mediante un fichero php que se encarga de hacer las redirecciones según la página solicitada.
Para esto lo primero que hay que hacer es conseguir que todas las solicitudes vayan al fichero en php que hace la redirección. Para esto ponemos en el .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ redirect.php?$1 [L,QSA]
Ahora hay que crear un fichero php que contenga lo siguiente:
<?php
// De ht tp://skiffie. com/code/php/replace-once
function str_replace_count($search,$replace,$subject,$times) {
$subject_original=$subject;
$len=strlen($search);
$pos=0;
for ($i=1;$i<=$times;$i++) {
$pos=strpos($subject,$search,$pos);
if($pos!==false) {
$subject=substr($subject_original,0,$pos);
$subject.=$replace;
$subject.=substr($subject_original,$pos+$len);
$subject_original=$subject;
} else {
break;
}
}
return($subject);
}
$direcciones = array();
$handle = fopen("redirecciones.csv", "r");
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
$num = count($data);
$direcciones[$data[0]] = $data[1];
}
fclose($handle);
/*
echo '';
print_r($direcciones);
echo '';
*/
$_SERVER['QUERY_STRING'] = str_replace_count('&','?',$_SERVER['QUERY_STRING'],1);
//echo 'Dirección: ' . $_SERVER['QUERY_STRING'];
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: ht tp://www.nuevo-dominio.es/" . $direcciones[$_SERVER['QUERY_STRING']] );
//echo "Hay que redireccionar a ht tp://www.nuevo-dominio.es/" . $direcciones[$_SERVER['QUERY_STRING']] . '';
?>
(eh puesto un espacio en cada ocurrencia de http por que el filtro que usa este post le intentaba poner un enlace y me fastidiaba el código)
Tened en cuenta que todavía no lo he probado demasiado y que es algo hecho de forma rápida.
Ahora sólo falta crear un fichero csv (en mi caso lo he separado por punto y coma) en el que el primer parámetro sea el origen y el segundo el destino (en mi caso no he puesto los dominios). Algo así:
product_info.php/cPath/21/products_id/36;producto/aceite-de-onagra
product_info.php/cPath/21/products_id/188;producto/aceite-de-salmon-450-perlas-omega-3
En lugar de usar un fichero csv y llenarlo a mano también se podría, usando las bases de datos de las dos webs, hacer algo más automático aunque en nuestro caso no se podía ya que los títulos no siempre eran los mismos.
Aún no está en uso ya que la wen web no está "publicada" pero podéis ver que realmente hace el 301 (necesario para mantener el posicionamiento) usando esta herramienta y poniendo en el input http://www.amatusalud.es/redirect/product_info.php?products_id=163
Redirección del dominio sin www a con www en Drupal con multisite
Carlos — Dom, 21/09/2008 - 14:20
Si quieres que se pueda acceder a tu dominio sin www's y con y quieres evitar las páginas duplicadas un buen método es hacer una redirección de un sitio a otro usando mod_rewrite.
Para hacerlo normalmente no hay problema, de sin www' a con sería algo así:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\.dominio\.com [NC]
RewriteRule ^(.*) http://www.dominio.com/$1 [L,R=301]
y para que sea al revés, de www's a sin:
RewriteCond %{HTTP_HOST} !^dominio\.com\.es [NC]
RewriteRule ^(.*) http://dominio.com/$1 [L,R=301]
(de telendro.com.es)
El problema en Drupal si usamos el multiste es que sólo hay un .htaccess para todos los dominios por lo que no podemos ponerlo en el .htaccess. Pero no está todo perdido, también se puede hacer:
Para pasar de sin www's a con:
RewriteCond %{REQUEST_URI}\\/%{HTTP_HOST}/www. ^/+(.+/)?[^.]*[^/]\\(/)([^w][^w][^w][^.].*/(www\.)¦.*)$ [OR,NC]
RewriteCond %{HTTP_HOST}/www. ^(/)?(/)?([^w][^w][^w][^.].*/(www\.))$ [NC]
RewriteRule ^ http://%4%{HTTP_HOST}%{REQUEST_URI}%2 [L,R=301]
(encontrado por Pedro)
y para pasar de www' a sin:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
(visto en el blog de Alex Sancho)
Comentarios recientes
hace 3 años 6 semanas
hace 3 años 39 semanas
hace 3 años 47 semanas
hace 4 años 3 días
hace 4 años 8 semanas
hace 4 años 8 semanas
hace 4 años 9 semanas
hace 4 años 10 semanas
hace 4 años 10 semanas
hace 4 años 11 semanas