Staram się uporać z pewnym problemem. Sytuacja wygląda mniej więcej tak:
- Serwis główny example.com
- Serwisy dodatkowe w subdomenach example.com, np. sub1.example.com, sub2.example.com, sub3.example.com
Serwisy działają na jednym serwerze i są obsługiwane przez jedną aplikację.
Chciałbym, aby sesja była wspólna dla wszystkich tych serwisów, z wyjątkiem serwisu sub3.example.com, który korzystałby z odrębnej sesji.
Myśląc logicznie powinniśmy ustawić session.cookie_domain na ".example.com" dla serwisów ze wspólną sesją, a w sub3 nic nie zmieniać, aby ciastko sesji było zapisywane w jego domenie.
Problem polega na tym, że wchodząc najpierw na jeden ze "wspólnych" serwisów tworzy się cookie z ID sesji w domenie ".example.com", a następnie po wejściu na serwis sub3.example.com zamiast utworzyć nowe ID sesji, aplikacja skorzysta z istniejącego ID. Jest to w sumie logiczne, ponieważ domena ciasteczka pasuje do aktualnej subdomeny - nie ma więc powodu do stworzenia nowej sesji.
Na początku myślałem, aby rozwiązać to tak, że w sesji zapisuję domenę, pod którą zapisane jest jej ciastko. Po wczytaniu sesji sprawdzałbym, czy zapisana domena jest identyczna z tą, która powinna być użyta i w przypadku różnic uruchomiłbym funkcję "session_regenerate_id(false);", aby wygenerować nowe ID sesji, pozostawiając jednocześnie aktualnie wczytaną sesję, dzięki czemu byłaby ona wciąż dostępna na wykorzystujących ją serwisach.
Rozwiązanie działa połowicznie. Stworzenie nowej sesji w odpowiedniej domenie po wykryciu różnic nie jest problemem... Gorzej ze zmuszeniem aplikacji, aby korzystała z nowej sesji. Wygląda na to, że nawet po wygenerowaniu nowego identyfikatora sesji przy kolejnym przeładowaniu użyta zostanie wcześniej wygenerowana sesja. Musiałbym usuwać poprzednią sesję używając argumentu "true" przy regeneracji, jednak tym sposobem użytkownik nie będzie mógł być zalogowany na kilku serwisach jednocześnie.
Opisane zachowanie nie jest błędne, ponieważ wg RFC 2109 przy wyborze odpowiedniego ciasteczka istotna jest tylko ścieżka, a domena musi jedynie "pasować" :
Cytat
If multiple cookies satisfy the criteria above, they are ordered in
the Cookie header such that those with more specific Path attributes
precede those with less specific. Ordering with respect to other
attributes (e.g., Domain) is unspecified.
the Cookie header such that those with more specific Path attributes
precede those with less specific. Ordering with respect to other
attributes (e.g., Domain) is unspecified.
Macie pomysł, jak rozwiązać tego typu problem? Najlepiej byłoby, gdyby wczytywane było ciasteczko o domenie jak najbliższej, tzn. jeśli istniałyby ciasteczka z domenami "example.com" oraz ".example.com" to dla serwisu exampe.com wybierane byłoby ciasteczko 1. Nie wiem jednak, czy coś takiego jest w ogóle możliwe. Być może jednak Wy macie jakieś większe doświadczenia w tej kwestii?
Pozdrawiam serdecznie,
Adam
EDIT
--------------------
Prawdopodobnie poradziłem sobie z problemem. Generuję indywidualny ciąg znaków dla par domena/ścieżka i ciąg ten wstawiam jako nazwę ciastka sesji (session.name). Dzięki temu nie ma problemu z identyfikacją sesji odpowiednich dla danych obszarów aplikacji. Że też wcześniej na to nie wpadłem
