Maison >développement back-end >tutoriel php >Solution pour la coexistence de noms de domaines entre sessions sous Yii2
J'ai parlé plus tôt des configurations liées aux sessions. Pendant le développement, le module de connexion est souvent nécessaire pour partager des sessions entre domaines. Je pense que de nombreux amis développeurs ont rencontré ce problème. Vous n'avez besoin que d'un seul endroit pour vous connecter, et le site Web associé est. également en statut de connexion. Il y a deux situations : l'une se situe entre 9streets.cn et a.9streets.cn, et l'autre se situe entre a.com et b.com. J'ai résumé les méthodes de traitement ces derniers jours.
Qu'il s'agisse d'un nom de domaine de premier et deuxième niveaux, ou de cross-domain sous différents noms de domaines, deux points doivent être atteints :
Le client accède au même sessionId,
La localisation des données de session accessibles par les serveurs correspondant à tous les noms de domaine doit être cohérente.
1. L'accès à l'ID de session commun se fait principalement en écrivant l'ID de session actuel dans le cookie.
Les cookies ne sont pas accessibles sous différents noms de domaine. Nous devons définir l'utilisateur en arrière-plan. l'accès Lors de la connexion, définissez le nom de domaine qui doit être partagé. S'il se trouve sous le nom de domaine de 1er ou 2ème niveau, définissez directement le cookie sur le nom de domaine principal, par exemple :
setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".a.com");<.> Peut-être vous demanderez-vous : et si c'est sur un nom de domaine différent ? Il s'agit d'une solution simple utilisant la technologie P3P. Le principe de mise en œuvre est que lors de l'accès au site x.com, le programme y.com déclenche l'écriture de la valeur sessionid dans le fichier y.com, puis peut obtenir la valeur sessionid. la valeur de session est stockée dans la base de données et la même valeur est obtenue. La valeur sessionid est suffisante. Cela nécessite que les fichiers du programme dans y.com soient accessibles sur tous les domaines. Par défaut, les navigateurs ne peuvent pas définir de cookies sur tous les domaines. Vous devez ajouter l'en-tête p3p. Ajouter : header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');2.emplacement de stockage des données de session Méthode de mise en œuvre cohérente
$host = explode('.', $_SERVER["HTTP_HOST"]); if (count($host) > 2) { define('DOMAIN', $host[1] . '.' . $host[2]); } else { define('DOMAIN', $host[0] . '.' . $host[1]); } define('DOMAIN_HOME', 'www.' . DOMAIN); define('DOMAIN_USER_CENTER', 'man.' . DOMAIN); define('DOMAIN_API', 'api.' . DOMAIN); define('DOMAIN_EMAIL', 'mail.' . DOMAIN); define('DOMAIN_LOGIN', 'login.' . DOMAIN); define('DOMAIN_IMG', 'img.' . DOMAIN);Ensuite, configurez l'utilisateur et la session :
'user' => [ 'enableAutoLogin' => true, 'identityCookie' => ['name' => '_identity', 'httpOnly' => true, 'domain' => '.' . DOMAIN], ], 'session' => [ 'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0], 'timeout' => 3600, ],Ici, j'ai noté le domaine dans l'utilisateur et la session des éléments de configuration . Par exemple : 'domain'=>'.baidu.com', il n'est donc pas nécessaire de juger