2009-08-18 5 views
6

Gut, wie ich auch früher gepostet habe ... Ich habe eine Website in zwei Sprachen erstellt. Eines mit URL www.mainDomain.com (Englisch) und anderen mit www.fr.subDomain.com (Französisch).Problem bei der Aufrechterhaltung der Sitzung zwischen zwei verschiedenen Domänen auf einer Website in CakePHP getan

Beide sind in CakePHP gemacht, auf Französisch habe ich gerade die Ansichten davon auf Französisch geändert. Aber das Problem ist, wenn jemand in der englischen Version anmeldet und dann zur französischen Version wechselt, erkennt die Sitzung ihn nicht und fordert erneut zur Anmeldung auf. Es ist der größte Fehler in der Web-Anwendung geworden, den ich bis jetzt gemacht habe.

Dafür, wie Swanny mir sagte, durch a link zu gehen, und ich tat es auf meiner Anwendung, wie es auf dem Link gesagt wurde.Apparently funktionierte es für die Anmeldung, die Sitzung zwischen zwei Domänen geteilt (Haupt-Domäne und Subdomain). Aber als ich es gründlich überprüfte, erkannte ich, dass beide Seiten die neuesten NEWS aus der Datenbank werfen, beide Daten sind unterschiedlich. Nur um zu überprüfen, ob ich falsch lag, änderte ich die save-Variable in der Datenbank im Session-Array. Aber jetzt hat es sich geweigert, sich an irgendetwas (Sitzung) zu erinnern. Könnte mir jemand vorschlagen, was könnte das Problem sein und wie kann ich das lösen ... ???

Vielen Dank im Voraus

Antwort

3

Ich bin nicht sicher, ob ich völlig verstehen, aber ich werde versuchen. Ich denke, das ist eine PHP-Einstellung namens session.cookie_domain.

Angenommen, Ihre Websites haben die folgenden URLs:

Die gewünschte Einstellung ist: .example.org.

Sie können dies in php.ini anpassen, eine .htaccess Datei oder auch in PHP selbst:

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

Wenn Sie Ihre Webseiten auf zwei völlig unterschiedlichen Domänen ausgeführt werden, zum Beispiel:

... dann gibt es keine Möglichkeit, den Cookie zwischen diesen zwei verschiedenen Domains zu teilen.

+0

ich ubuntu und zend framwork verwende. Wo sollte ich obigen Code schreiben? Danke – NAVEED

+0

was ist, wenn Sie example.org und sub.example.com haben. Wird das möglich sein? – Dobler

+1

@Dobler Verschiedene Domains? Nein. Sie brauchen eine Brücke - wie eine Art Redirect, um das zu schaffen. Oder Sie holen den Anmeldestatus auf der Clientseite mit einer domainübergreifenden Anfrage mit JavaScript (z. B. jsonp) ein. – Till

2

Wenn Sie zwei unterschiedliche Domains haben, würde ich vorschlagen, die folgenden:

On "www.mainDomain.com", einen Link zu der "www.fr.subDomain.com" site setzen und das Cookie passieren in Ihre Ansicht Datei:

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

Dann auf der französisch-Website ein Stück Code hinzufügen, um die Cookies im app_controller.php> before() zu imitieren.

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. 
    } 
} 

Nun, da die Cookies übereinstimmen, werden Sie entweder auf den Einsatz Datenbanksitzungen oder den Kuchen Datei-basierte Sitzungen haben. Lesen Sie die Anweisungen in der core.php, um diese einzurichten.

Dies sollte Ihnen ermöglichen, im Grunde die gleiche Sitzung über verschiedene Websites zu teilen. Ich bin gerade dabei, ACL über mehrere Standorte mit einer einzigen Anmeldung zu implementieren. Es kann etwas knifflig werden, aber mach es nur Schritt für Schritt, du wirst es schaffen. Haben Sie auch keine Angst, in den Cake-Code zu springen, um zu sehen, wie es funktioniert.

3

@dooltaz Das ist eine großartige Lösung. Das Problem ist, dass der Kuchen den Keks nach mir zu setzen scheint. Was ich tat, stattdessen ist es, den Benutzer ro eine Umleitung Methode senden und dann die Cookie-Einstellung

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. 
    } 
} 

zu Nachfilter bewegen (auch feste Tippfehler in Ihrem Code ..)

Verwandte Themen