Pokazywanie postów oznaczonych etykietą domeny. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą domeny. Pokaż wszystkie posty

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