2009-08-18 10 views
6

Come ho già postato in precedenza ... Ho creato un sito in due lingue. Uno con URL www.mainDomain.com (inglese) e altro con www.fr.subDomain.com (francese).Problema nel mantenere la sessione tra due diversi domini su un sito Web fatto in CakePHP

Entrambi sono fatti in CakePHP, in francese ho appena cambiato le sue opinioni in francese. Ma il problema è che quando qualcuno effettua il login nella versione inglese e poi passa alla versione francese, la sessione non lo riconosce e chiede di nuovo il login. È diventato il bug più grande nell'applicazione Web che ho fatto fino ad ora.

Per quello, come Swanny mi ha detto di passare attraverso a link e l'ho fatto sulla mia applicazione come è stato detto sul link.Apparentemente, ha funzionato per l'accesso che sessione condivisa tra due domini (dominio principale e il suo sottodominio). Ma quando ho controllato a fondo, ho riconosciuto che entrambi i siti stanno lanciando le ultime notizie dal database, entrambi i dati sono diversi. Solo per verificare se ero sbagliato ho cambiato alcune variabili di salvataggio nel database nell'array di sessione. Ma ora si è rifiutato di ricordare qualsiasi cosa (sessione). Qualcuno potrebbe suggerirmi cosa potrebbe essere un problema con questo e come posso risolvere questo ... ???

Grazie in anticipo

risposta

3

non sono sicuro ho completamente capito, ma Sto andando provare. Penso che si tratti di un'impostazione PHP chiamata session.cookie_domain.

Assumendo i vostri siti web hanno i seguenti URL:

l'impostazione desiderata è: .example.org.

È possibile regolare questo in php.ini, un file .htaccess o anche in PHP per sé:

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

Se i vostri siti web eseguite su due domini completamente diversi, ad esempio:

... quindi non c'è modo di condividere il cookie tra questi due diversi domini.

+0

sto usando ubuntu e Zend inquadramento. Dove dovrei scrivere sopra il codice? Grazie – NAVEED

+0

e se hai example.org e sub.example.com. Sarebbe possibile? – Dobler

+1

@Dobler Domini diversi? No. Hai bisogno di un ponte - come un reindirizzamento di qualche tipo per farlo funzionare. O si inserisce lo stato di accesso sul lato client con una richiesta interdominio utilizzando JavaScript (ad es. Jsonp). – Till

2

Se si dispone di due domini diversi, vorrei suggerire quanto segue:

On "www.mainDomain.com", inserire un link al sito "www.fr.subDomain.com" e passare il cookie nel il file di vista:

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

Poi sul sito francese di aggiungere un po 'di codice per imitare i cookie nel 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. 
    } 
} 

Ora che i cookie coincidono, è necessario utilizzare le sessioni del database o le sessioni basate su file di torta. Leggi le istruzioni in core.php per impostarle.

Questo dovrebbe consentire di condividere sostanzialmente la stessa sessione su vari siti. In realtà sto implementando ACL su più siti con un singolo accesso. Può essere un po 'complicato, ma fallo passo dopo passo, lo farai. Inoltre non abbiate paura di saltare nel codice core della Cake per vedere come funziona.

3

@dooltaz Questa è un'ottima soluzione. Il problema è che la torta sembra impostare il cookie dopo di me. Quello che ho fatto è invece inviare all'utente ro un metodo di reindirizzamento e quindi spostare l'impostazione cookie al 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. 
    } 
} 

(errore di battitura corretti anche nel codice ..)

Problemi correlati