wtorek, 19 sierpnia 2008

Utrzymywanie sesji między subdomenami serwisu i innymi domenami

Ostatnio spotkałem się z problemem utrzymywania sesji między wszystkimi subdomenami w serwisie.
Co się okazało, większość programistów aplikacji sieciowych spotkała się już z tym problemem.
Sesje i ciasteczka to produkt bardzo wrażliwy, nie może być ustawiany jak nam sie podoba lecz według pewnych reguł...

Wróćmy do problemu:

Mamy dwie domeny:
1. dottech.pl
2. php.pl

I każda z tych domen posiada kilka subdomen.

Problem polega na tym, że jak wystartuje sesję np w mojekwiatki.dottech.pl to chcę, aby była widoczna nawet z poziomu forum.php.pl


Rozwiązanie:

Do pliku .htaccess w głównym katalogu każdej subdomeny dodajemy linijkę:
php_value session.cookie_domain '.dottech.pl

Gdzie domena to nazwa domeny pod którą jest serwis.

OK teraz utrzymujemy sesję w obrębie naszej domeny, ale jeszcze nie jesteśmy widoczni z drugiej domeny.

Tak więc: w nagłówku strony dodajemy skrypt JavaScript (No dobra, ECMAScript):

<script type="text/javascript">
function setOutCookie(session_id,host){
var addr = host+'__setcookie.php?sid='+session_id;
sessionImg = new Image();
sessionImg.src = addr;
}

setOutCookie('<?=session_id();?>','http://dottech.pl/');
setOutCookie('<?=session_id();?>','http://php.pl/');
</script>
Ten sam skrypt musi być w nagłówkach wszystkich serwisów i być wywoływany w momencie wywoływania sesji (np. logowania).

Ostatni krok to plik __setcookie.php, który powinien być w głównych katalogach domen.
Skrypt ten ustawia sesję i wygląda następująco:
<php
preg_match('#[^.]+\.[^.]+$#', $_SERVER['HTTP_HOST'], $matches);
setcookie('PHPSESSID', $_GET['sid'], 0, '/', '.'.$matches[0]);
?>
I to wszystko ;)
Od teraz możemy się cieszyć jedną sesją na wielu swoich domenach :)

Pozdrawiam,
Michał Woliński

1 komentarz:

Unknown pisze...

Czy ktoś to sprawdził czy działa? Mam 2 witryny stara (comes.com.pl) i nową (dealer.comes.com.pl). I po zalogowaniu na tej pierwszej drugą powinno się przeglądać jako już zalogowany użytkownik. I mimo że sesja jest trzymana w tym samym miejscu (.comes.com.pl) robię to przez: ini_set("session.cookie_domain", ".comes.com.pl"); i jest ten sam session id. To wygląda to tak, jak by ten skrypt nie działał. Po zalogowaniu się na pierwszej witrynie i przejściu na drugą witrynę żadne dane nie są powielane z tej pierwszej witryny, przez co cały czas na tej drugiej witrynie jestem nie zalogowany. Czy ktoś może zna rozwiązanie tego problemu? A może ten skrypt jest nie działający. A może trzeba coś jeszcze w configu zmienić?
Pozdrawiam,