2009-08-18 15 views
6

Bueno, como he publicado antes también ... He creado un sitio en dos idiomas. Uno con URL www.mainDomain.com (inglés) y otro con www.fr.subDomain.com (francés).Problema en el mantenimiento de la sesión entre dos dominios diferentes en un sitio web hecho en CakePHP

Ambos se hacen en CakePHP, en francés. Acabo de cambiar las vistas al francés. Pero el problema es que cuando alguien inicia sesión en la versión en inglés y luego cambia a la versión en francés, la sesión no lo reconoce y solicita el inicio de sesión nuevamente. Se ha convertido en el error más grande en la aplicación web que he hecho hasta ahora.

Para eso, como Swanny me dijo que fuera a link y lo hice en mi aplicación como se decía en el enlace. Al parecer, funcionó para el inicio de sesión que compartió sesión entre dos dominios (dominio principal y su subdominio). Pero cuando lo revisé a fondo, reconocí que ambos sitios están arrojando las últimas NOTICIAS de la base de datos, ambos datos son diferentes. Solo para comprobar si me equivoqué, cambié la variable de guardar a la base de datos en la matriz de sesión. Pero ahora se negó a recordar nada (sesión). ¿Alguien podría sugerirme qué podría ser un problema con esto y cómo puedo resolverlo ...?

Gracias de antemano

Respuesta

3

no estoy seguro de entender completamente, pero voy a intentarlo. Creo que se trata de una configuración PHP llamada session.cookie_domain.

Suponiendo sus sitios web tienen las siguientes URL:

El ajuste que desea es: .example.org.

Puede ajustar esto en php.ini, un archivo .htaccess o incluso en PHP en sí:

<?php ini_set('session.cookie_domain', '.example.org'); ?> 

Si sus sitios web se ejecutan en dos dominios completamente diferentes, por ejemplo:

... entonces no hay forma de compartir la cookie entre estos dos dominios diferentes.

+0

estoy usando Ubuntu y framwork Zend. ¿Dónde debería escribir el código anterior? Gracias – NAVEED

+0

qué tal si tienes example.org y sub.example.com. ¿Sería eso posible? – Dobler

+1

@Dobler Diferentes dominios? No. Necesita un puente, como una redirección de algún tipo para que esto funcione. O ingresa el estado de inicio de sesión en el lado del cliente con una solicitud entre dominios utilizando JavaScript (por ejemplo, jsonp). – Till

2

Si tiene dos dominios diferentes, sugeriría lo siguiente:

En "www.mainDomain.com", poner un enlace al sitio "www.fr.subDomain.com" y pasar la galleta en su vista de archivo:

$session_cookie = $_COOKIE[Configure::read('Session.cookie')]; 
echo $html->link('See French Site', 'http://www.fr.subDomain.com/?session_key='.$session_cookie); 

a continuación, en el sitio francés añadir un poco de código para imitar las cookies en la app_controller.php> beforeFilter().

function beforeFilter() { 
    if(!empty($this->params['url']['session_key']) { 
     // Setup variables here... 
     setcookie(Configure::read('Session.cookie'), $session_cookie, time()+360000, '/', $domain); 
     // You could use CAKE's setcookie command here. 
    } 
} 

Ahora que las galletas coinciden, usted tendrá que ya sea sesiones de bases de datos de uso o las sesiones basadas en archivos pastel. Lee las instrucciones en core.php para configurarlas.

Esto debería permitirle básicamente compartir la misma sesión en varios sitios. De hecho, estoy implementando ACL en varios sitios con un solo inicio de sesión. Puede llegar a ser un poco complicado, pero solo hazlo paso a paso, lo harás bien. Tampoco tengas miedo de saltar al código básico de Cake para ver cómo funciona.

3

@dooltaz Esa es una gran solución. Ser problema es que el pastel parece estar poniendo la cookie detrás de mí. Lo que hice en cambio se envía al usuario un método de redirección ro y luego mover la configuración de cookies a la afterFilter

function afterFilter() { 
    if (!empty($this->params['url']['session_key'])) { 
     // Setup variables here... 
     setcookie(Configure::read('Session.cookie'), $this->params['url']['session_key'], time()+360000, '/'); 
     // Cakes cookie method will put your cookie name in [] so it does not work. 
    } 
} 

(errata También se ha corregido en el código ..)

Cuestiones relacionadas