Próbuję skonfigurować następujące elementy:
auth.example.com
sub1.example.com
sub2.example.com
Jeśli użytkownik odwiedza witrynę sub1.example.com
lub sub2.example.com
nie jest zalogowany, zostaje przekierowany auth.example.com
i może się zalogować.
sub1.example.com
i sub2.example.com
są to dwie oddzielne aplikacje, ale używają tych samych poświadczeń.
Próbowałem ustawić następujące w moim php.ini:
session.cookie_domain = ".example.com"
ale wydaje się, że nie przekazuje informacji z jednej domeny do drugiej.
[Edytować]
Próbowałem następujących rzeczy:
sub1.example.com/test.php
session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.example.com/test.php">Change Sites</a>'
auth.example.com/test.php
session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);
Identyfikatory sesji są dokładnie takie same, ale kiedy zrzucam $_SESSION
zmienną, nie pokazuje ona obu kluczy, tylko ten, który ustawiłem w każdej domenie.
php
authentication
session
cross-domain
Dragonmantank
źródło
źródło
Odpowiedzi:
Nie wiem, czy problem nadal istnieje, ale właśnie napotkałem ten sam problem i rozwiązałem go ustawiając nazwę sesji przed wywołaniem
session_set_cookie_params()
:$some_name = session_name("some_name"); session_set_cookie_params(0, '/', '.example.com'); session_start();
Nic nie zmieniłem w moim,
php.ini
ale teraz wszystko działa dobrze.źródło
$some_name = session_name("some_name");
to zrobił. Dziękuję i zagłosuj.session_name("domain");
było dla mnie brakującym składnikiem. Brakuje dokumentacji na php.net dotyczącej tych ustawień sesji. Istnieją posty społeczności na php.net, które wskazują, że nazwa session.name musi zostać zdefiniowana przed zastosowaniem zmian w session_set_cookie_params ().ini_set("session.cookie_domain", ".domain.com");
przyczynę, która powodowała, że tworzył nowy identyfikator sesji przy każdym odświeżaniu.Jedną z rzeczy, która może w tajemniczy sposób uniemożliwić odczyt danych sesji z subdomeny, pomimo poprawnego ustawienia plików cookie,
.example.com
jest łatka PHP Suhosin. Możesz mieć wszystko poprawnie skonfigurowane, jak na przykładach w pytaniu, i po prostu może nie działać.Wyłącz następujące ustawienia sesji Suhosin i wrócisz do pracy:
źródło
Spróbuj użyć:
session.cookie_domain = "example.com"
Zamiast:
session.cookie_domain = ".example.com"
Zwróć uwagę na brakujący okres na początku.
Uważaj jednak, ponieważ nie jest obsługiwany przez wszystkie przeglądarki.
źródło
Miałem dokładnie ten problem - chciałem, aby wartości sesji utworzone na x.example.local były dostępne na example.local i na odwrót.
Wszystkie rozwiązania, które znalazłem, mówiły, że zmieniają domenę sesji za pomocą
php_value session.cookie_domain .example.local
.htaccess (lub przez php.ini lub przez ini_set).Problem polegał na tym, że ustawiałem
session.cookie_domain
dla wszystkich subdomen (do tej pory ok), ale także dla domeny głównej. Ustawieniesession.cookie_domain
na domenie głównej najwyraźniej nie jest możliwe.Zasadniczo sposób, w jaki to zadziałało dla mnie:
session.cookie_domain
dla WSZYSTKICH PODDOMEN.O tak, upewnij się, że domena ma domenę TLD (w moim przypadku .local). Protokół HTTP nie pozwala na przechowywanie plików cookie / sesji w domenie bez .tld (tzn. Localhost nie będzie działać, ale stuff.localhost tak).
EDYTUJ : Upewnij się również, że zawsze usuwasz pliki cookie przeglądarki podczas testowania / debugowania sesji w subdomenach. Jeśli tego nie zrobisz, Twoja przeglądarka zawsze będzie wysyłać stary plik cookie sesji, który prawdopodobnie nie ma jeszcze ustawionego prawidłowego pliku cookie_domain. Serwer ożywi starą sesję i uzyskasz fałszywie negatywne wyniki. (w wielu postach jest mowa o używaniu session_name ('stuff') dla dokładnie tego samego efektu)
źródło
Rozwiązałem to w ten sposób
ini_set('session.cookie_domain', '.testdomain.example'); session_start();
Ponieważ pracowałem na localhost
ini_set('session.cookie_domain', '.localhost');
nie działał , widzi .localhost jako najwyższy poziom zamiast .com / .local / ... (podejrzewam)
źródło
Potwierdziłem. Odpowiedź joreona jest prawidłowa. Nie mogę komentować, ponieważ moja reputacja nie wystarczy, więc zamieszczam tutaj komentarz.
Zdefiniuj stałą w pliku konfiguracyjnym. Jeśli chcesz to zmienić, nie musisz modyfikować całych plików.
define('ROOT_DOMAIN', 'mysite.example'); define('PHP_SESSION_NAME', 'MYSITE');
Nazwa sesji nie może składać się tylko z cyfr, musi być obecna przynajmniej jedna litera. W przeciwnym razie za każdym razem generowany jest nowy identyfikator sesji.
Użyj poniższego kodu, aby rozpocząć korzystanie z sesji
session_name(PHP_SESSION_NAME); session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN); session_start();
Używam tej funkcji:
function load_session() { if (session_status() == PHP_SESSION_NONE) { session_name(PHP_SESSION_NAME); session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN); session_start(); } elseif (session_name() != PHP_SESSION_NAME) { session_destroy(); session_name(PHP_SESSION_NAME); session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN); session_start(); } } load_session(); // put it in anywhere you want to use session
źródło
Używaj go w każdej domenie / subdomenie:
session_name('name'); ini_set('session.cookie_domain', '.example.com'); ini_set('session.save_path', '/var/lib/php/session'); session_start();
Ścieżka do
session.save_path
może być inna w Twoim przypadku, ale powinna być taka sama w każdej domenie / subdomenie. Nie zawsze jest to prawda.źródło
Użyj tego, to działa:
ini_set('session.cookie_domain', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
źródło
Łączone użycie sesji plików cookie domeny podrzędnej i domeny głównej
Ratunek: http://php.net//manual/tr/function.session-set-cookie-params.php
Sprawdziłem działa
sub.example.com/sessionadd.php?id=123 example.com/sessionview.php // 123
- Kody
<?php $currentCookieParams = session_get_cookie_params(); $rootDomain = '.example.com'; session_set_cookie_params( $currentCookieParams["lifetime"], $currentCookieParams["path"], $rootDomain, $currentCookieParams["secure"], $currentCookieParams["httponly"] ); session_name('mysessionname'); session_start(); setcookie($cookieName, $cookieValue, time() + 3600, '/', $rootDomain); ?>
źródło
Wydaje mi się, że nie chcesz czegoś takiego jak OpenID, jak sugeruje Joel, ale chcesz mieć dostęp do danych sesji w wielu domenach.
Jedyną możliwością, którą mogę sobie wyobrazić jako rozwiązanie tego problemu, jest przechowywanie danych sesji w bazie danych i wyciąganie ich z tej bazy danych.
źródło
Miałem podobny problem jednak to rozwiązanie było dla mnie dobre, być może pomoże innym w przyszłości
edytuj plik php.ini
magia jest tutaj
https://www.sitepoint.com/community/t/sessions-across-subdomains-domain-com-phpsessid-changes/3013/19
źródło
Nie mogę wypowiadać się na temat innych wersji PHP, ale w 5.6.6 samo ustawienie
session.cookie_domain
wartości wphp.ini
pliku załatwiło sprawę, pozwalając wszystkim moim subdomenom na iPage współdzielić ten sam zestaw zmiennych sesji.Pamiętaj, aby usunąć wszystkie istniejące pliki cookie związane z Twoją domeną z przeglądarki, aby przetestować.
session.cookie_domain = '.yourdomainname.example'
Och, nie wiem, czy to robi jakąkolwiek różnicę, ale używam też autostartu sesji.
session.auto_start = 1
źródło
Po prostu spróbuj użyć następującego kodu powyżej
session_start()
metody$sess_life_time = 21600; //in seconds $sess_path = "/"; $sess_domain = ".example.com"; $sess_secure = true; // if you have secured session $sess_httponly = true; // httponly flag session_set_cookie_params($sess_life_time, $sess_path, $sess_domain, $sess_secure, $sess_httponly);
źródło
Przeczytałem wszystkie powyższe odpowiedzi, myślę, że moja odpowiedź jest pomocna dla osób szukających tego w Google:
upewnij się, że przeglądarki wysyłają plik cookie sesji z powrotem do serwerów (domeny i subdomen), ustaw domenę plików cookie sesji jako
.example.com
.Upewnij się, że PHP znajduje właściwy „cel”, aby przywrócić zmienną sesji:
session_save_path
jest taka sama dla wszystkich (testowałem)session_set_save_handler
do tego.źródło
Wiem, że to jest stare, ale działa dobrze w przypadku wielu domen i subdomen w tym samym pudełku.
<?php define('site_domain','example.com'); session_set_save_handler('_open', '_close', '_read', '_write', '_destroy', '_clean'); function _open(){ global $_sess_db; $db_user = 'user'; $db_pass = 'pass'; $db_host = 'localhost'; if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass)){ return mysql_select_db('database', $_sess_db); } return false; } function _close(){ global $_sess_db; return mysql_close($_sess_db); } function _read($id){ global $_sess_db; $id = mysql_real_escape_string($id); $domain = mysql_real_escape_string(site_domain); $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT'])); $sql = "SELECT data FROM sessions WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'"; if ($result = mysql_query($sql, $_sess_db)){ if (mysql_num_rows($result)){ $record = mysql_fetch_assoc($result); return $record['data']; } } return ''; } function _write($id, $data){ global $_sess_db; $access = time(); $id = mysql_real_escape_string($id); $access = mysql_real_escape_string($access); $data = mysql_real_escape_string($data); $domain = mysql_real_escape_string(site_domain); $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT'])); $sql = "REPLACE INTO sessions VALUES ('$id', '$access', '$data', '$domain', '$agent')"; return mysql_query($sql, $_sess_db); } function _destroy($id){ global $_sess_db; $id = mysql_real_escape_string($id); $domain = mysql_real_escape_string(site_domain); $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT'])); $sql = "DELETE FROM sessions WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'"; return mysql_query($sql, $_sess_db); } function _clean($max){ global $_sess_db; $old = time() - $max; $old = mysql_real_escape_string($old); $domain = mysql_real_escape_string(site_domain); $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT'])); $sql = "DELETE FROM sessions WHERE access < '$old' AND domain = '$domain' AND agent = '$agent'"; return mysql_query($sql, $_sess_db); }
?>
źródło
Posługiwać się :
session_name("put_a_session_name"); session_start([ "cookie_domain" => ".example.com", "cookie_path" => "/" ]);
źródło
Szybkim i brudnym rozwiązaniem jest użycie tego do przekierowania:
header( $url.'?'.session_name().'='.session_id() );
doda to
?PHPSESSID=etnm7kbuf5lg0r6tv7je6ehtn4
do adresu URL coś , co informuje PHP o identyfikatorze sesji, którego powinien użyć.źródło