Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Cuál es la mejor forma de hacer redirección sin caer en bucle!

Estas en el tema de Cuál es la mejor forma de hacer redirección sin caer en bucle! en el foro de PHP en Foros del Web. Hola, voy al grano. Tengo un Joomla multi-idioma que de momento sólo tiene 2 idiomas: mi-dominio.com/es/ mi-dominio.com/en/ La idea es redirigir al visitante a la ...
  #1 (permalink)  
Antiguo 13/05/2017, 09:27
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Cuál es la mejor forma de hacer redirección sin caer en bucle!

Hola, voy al grano.

Tengo un Joomla multi-idioma que de momento sólo tiene 2 idiomas:
  1. mi-dominio.com/es/
  2. mi-dominio.com/en/
La idea es redirigir al visitante a la versión de tal idioma según su IP (empleo esta librería). No habría ningún problema en hacer esto si la redirección se hiciera en un index.php y redirigiera a index-es.php o a index-en.php. Pero no existen index para cada idioma, sólo existe un index.php para todo.

El problema es que si hago un header:location dentro del index.php para que redirija a mi-dominio.com/es/ esto funciona, pero evidentemente cuando entre a mi-dominio.com/es/ se leerá nuevamente el index.php y por tanto se leerá nuevamente la redirección, y por consiguiente esto provoca un bucle infinito que causa un error: Chrome dice que hubo un error y no pudo cargarse la página porque el website intentó múltiples redirecciones.

¿Cómo evitar que redirija en un bucle infinito?

Finalmente me las arreglé así, pero dudo mucho que sea la mejor forma de hacerlo:
Código PHP:
if ( !isset($_SESSION["pais_cliente"]) ) {
    
$_SESSION["pais_cliente"] = getCountryFromIP($_SERVER["REMOTE_ADDR"]);
    
$pais_cliente $_SESSION["pais_cliente"];
    
$_SESSION["num_redirecciones"] = 1;

    if ( (
$pais_cliente == "EN") || ($pais_cliente == "UK") ) {
        
header('Location: http://www.mi-dominio.com/en/');
    }
    else {
        
header('Location: http://www.mi-dominio.com/es/');
    }
}
else {
    
$_SESSION["num_redirecciones"] ++;
    
$pais_cliente $_SESSION["pais_cliente"];

    if ( 
$_SESSION["num_redirecciones"] <= ) {
        if ( (
$pais_cliente == "EN") || ($pais_cliente == "UK") ) {
            
header('Location: http://www.mi-dominio.com/en/');
        }
        else {
            
header('Location: http://www.mi-dominio.com/es/');
        }
    }

Como verán, sólo permito que el bucle de redirecciones itere 2 veces máximo. Si después de eso visito nuevamente la página, evidentemente ya no se hace redirección y la página ya no me redirige a la versión en español o inglés según mi IP.

¿Cómo arreglo esto?

Saludos

Última edición por berkeleyPunk; 13/05/2017 a las 09:39
  #2 (permalink)  
Antiguo 13/05/2017, 09:47
Avatar de Turdo  
Fecha de Ingreso: julio-2005
Ubicación: .:Guadalajara:.
Mensajes: 398
Antigüedad: 18 años, 8 meses
Puntos: 23
Respuesta: Cuál es la mejor forma de hacer redirección sin caer en bucle!

Hola berkeleyPunk!

Yo hago lo siguiente:
Código PHP:
Ver original
  1. @$pa = strpos($_SERVER['HTTP_REFERER'],"mi-dominio.com");
  2. if($pa){
  3.     ...algo
  4. } else {
  5.     header('Location: http://www.eydosdigital.com/es/');
  6. }

Si $pa es verdadero quiere decir que ya se esta en el dominio y no redirecciono

Saludos!
__________________
Un buen programa depende de la imaginación.
  #3 (permalink)  
Antiguo 13/05/2017, 09:48
Avatar de petit89  
Fecha de Ingreso: marzo-2011
Mensajes: 1.135
Antigüedad: 13 años, 1 mes
Puntos: 170
Respuesta: Cuál es la mejor forma de hacer redirección sin caer en bucle!

almacenando el valor en una cookie local, puede ser otra alternativa... asi cada vez que visite la web ya sabe donde va...
__________________
█ WebHosting / Reseller a bajo costo | Uptime Garantizado | Soporte en Español e Ingles
¿Te sirvió la respuesta? Deja un +1 (Triangulo negro al lado derecho)
  #4 (permalink)  
Antiguo 13/05/2017, 11:58
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Sonrisa Respuesta: Cuál es la mejor forma de hacer redirección sin caer en bucle!

Cita:
Iniciado por Turdo Ver Mensaje
...Yo hago lo siguiente:
Código PHP:
Ver original
  1. @$pa = strpos($_SERVER['HTTP_REFERER'],"mi-dominio.com");
  2. if($pa){
  3.     ...algo
  4. } else {
  5.     header('Location: http://www.eydosdigital.com/es/');
  6. }
...
Gracias por responder, Turdo. Desgraciadamente no funciona como lo indicas, porque $_SERVER['HTTP_REFERER'] sólo guarda la URL de la página desde la cual llega el usuario siempre y cuando éste haya llegado a nuestro website desde un link. Pero como en nuestro caso se llega a nuestro website desde una redirección, $_SERVER['HTTP_REFERER'] es igual a false.

Igualmente, petit89, gracias por tu aporte. Pero el problema sería justo el mismo: Ya hay una cookie, ok, y la cookie dice que el usuario es de idioma español. Ahora tendría que hacer un script que lo redireccione a la versión en español de mi website, y cuando sea redireccionado se volverá a leer la cookie, y así en un loop infinito!

  #5 (permalink)  
Antiguo 14/05/2017, 13:56
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Cuál es la mejor forma de hacer redirección sin caer en bucle!

Hola berkeleyPunk,

Yo he hecho esta prueba y funciona perfectamente, no entra en bucle ni nada:

Código PHP:
Ver original
  1. if ( ($pais_cliente == "EN") || ($pais_cliente == "UK") ) {
  2.         header('Location: http://www.dominio.com/ingles.php');
  3.     }
  4.     else {
  5.         header('Location: http://www.dominio.com/espanol.php');
  6.     }

Tal vez esté omitiendo algo o falte algo que no termine de ver en tu código, pero así funciona...

Espero que te ayude...
  #6 (permalink)  
Antiguo 30/05/2017, 22:06
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Cuál es la mejor forma de hacer redirección sin caer en bucle!

Cita:
Iniciado por rbczgz Ver Mensaje
..Yo he hecho esta prueba y funciona perfectamente, no entra en bucle ni nada

rbczgz, creo que tenemos contextos distintos. En el ejemplo que pones, claramente no tienes ningún bucle infinito pues rediriges a tus usuarios a un documento distinto según el idioma: ingles.php y espanol.php. Pero en mi caso no hay dos archivos php distintos según el idioma, es el mismo index.php.

Pero en fin, a final de cuentas logré resolver mi problema, simplemente poniendo el condicional SIN el else. La forma es la siguiente:

Código PHP:
if(no existe cookie y $idioma == "es") {
  
// Redirijo a español
}
elseif(
no existe cookie y $idioma == "en") {
  
// Redirijo a inglés

Con lo cual se redirige al visitante a su idioma. De tal modo que si el usuario elige ver por voluntad el otro idioma, bien, que lo haga, pero en este otro caso ya no será redirigido pues ya existirá una cookie.
Resultó ser esto una tontería pero no sé qué me pasó, quizá estaba ya abrumado con tanto trabajo!

Saludos y gracias!

Última edición por berkeleyPunk; 30/05/2017 a las 22:19
  #7 (permalink)  
Antiguo 31/05/2017, 07:01
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Cuál es la mejor forma de hacer redirección sin caer en bucle!

Y si es el mismo index que necesidad tienes de redirigir?


Es decir, si es español aplicó español si es inglés aplicó inglés en el mismo index, si quieres cambiar de idioma guarda en una cookie como te dicen el idioma seleccionado por el usuario

Es decir

Código PHP:
Ver original
  1. if ( /* Existe cookie */ )
  2. {
  3.     /* Seleccionó idioma de cookie */
  4. }
  5. else
  6. {
  7.     /* idioma según ip */
  8. }
  9.  
  10. // Prosigue con el Script según el idioma pero no necesitas redireccionar.

Siento no ser las específico, pero estoy desde el móvil.
__________________
Unset($vida['malRollo']);

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:28.