Maison  >  Article  >  développement back-end  >  Comment résoudre le problème de la coexistence des sessions entre les noms de domaine sous Yii2

Comment résoudre le problème de la coexistence des sessions entre les noms de domaine sous Yii2

不言
不言original
2018-06-15 10:26:481780parcourir

Cet article présente principalement la solution pour la coexistence de sessions inter-domaines sous Yii2. Le contenu est assez bon, je vais le partager avec vous maintenant et le donner comme référence.

J'ai parlé plus tôt des configurations liées à la session. Pendant le développement, le module de connexion qui doit souvent être partagé entre les domaines est le module de connexion. Je pense que de nombreux amis développeurs l'ont rencontré. Vous n'avez besoin que d'un seul endroit pour vous connecter. dans, et le site Web associé est également connecté. 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 gestion 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 domaine, deux points doivent être atteints :

  • Le le client accède au même sessionId,

  • L'emplacement des données de session accédées par les serveurs correspondant à tous les noms de domaine doit être cohérent.

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 des noms de domaine différents, nous en avons besoin lors de l'accès. et en configurant l'utilisateur pour qu'il se connecte en arrière-plan, définissez le nom de domaine qui doit être partagé avec les informations de connexion. S'il s'agit d'un nom de domaine à 1 ou 2 niveaux, 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 s'ils se trouvent dans des noms de domaine différents ? 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 Web x.com, le programme y.com déclenche l'écriture de la valeur sessionid dans le fichier y.com, la valeur sessionid peut être obtenue, puis la session. La valeur est stockée dans la base de données, et la même 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 au fichier php correspondant :

header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

2. La méthode de mise en œuvre d'un emplacement de stockage cohérent des données de session


Les données de session sont stockées dans le fichier tmp du serveur par default. , existe sous la forme d'un fichier au lieu d'être stocké dans la mémoire du serveur. Il faut ici le modifier pour qu'il soit accessible dans tous les domaines. Le stockage de base de données, le stockage de fichiers et le stockage de mémoire sont introduits en ligne. Si une base de données est utilisée pour stocker les données de session et que le site Web compte un grand nombre de visites, la lecture et l'écriture de SESSION fonctionneront fréquemment sur la base de données, et l'efficacité sera réduite. considérablement réduit. Vous pouvez considérer la présence de mémoire. Le serveur est implémenté. Le fichier session.rar suivant présente un exemple de session d'inventaire des données.

Pour traiter ce problème sous yii2, la configuration réussie selon les tutoriels trouvés sur Internet est la suivante :


Configurer dans main.php dans le dossier config du frontend

$host = explode(&#39;.&#39;, $_SERVER["HTTP_HOST"]);
if (count($host) > 2) {
  define(&#39;DOMAIN&#39;, $host[1] . &#39;.&#39; . $host[2]);
} else {
  define(&#39;DOMAIN&#39;, $host[0] . &#39;.&#39; . $host[1]);
}
define(&#39;DOMAIN_HOME&#39;, &#39;www.&#39; . DOMAIN);
define(&#39;DOMAIN_USER_CENTER&#39;, &#39;man.&#39; . DOMAIN);
define(&#39;DOMAIN_API&#39;, &#39;api.&#39; . DOMAIN);
define(&#39;DOMAIN_EMAIL&#39;, &#39;mail.&#39; . DOMAIN);
define(&#39;DOMAIN_LOGIN&#39;, &#39;login.&#39; . DOMAIN);
define(&#39;DOMAIN_IMG&#39;, &#39;img.&#39; . DOMAIN);

Puis configurez l'utilisateur et la session :

&#39;user&#39; => [
  &#39;enableAutoLogin&#39; => true,
  &#39;identityCookie&#39; => [&#39;name&#39; => &#39;_identity&#39;, &#39;httpOnly&#39; => true, &#39;domain&#39; => &#39;.&#39; . DOMAIN],
],
&#39;session&#39; => [
  &#39;cookieParams&#39; => [&#39;domain&#39; => &#39;.&#39; . DOMAIN, &#39;lifetime&#39; => 0],
  &#39;timeout&#39; => 3600,
],

Voici le élément de configuration Dans l'utilisateur et la session, j'ai noté le domaine, par exemple : 'domain'=>'.baidu.com', afin qu'il n'y ait pas besoin de juger


Ce qui précède. C'est tout le contenu de cet article, j'espère qu'il sera utile à tout le monde. Apprendre est utile. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Problèmes liés à l'utilisation de jquery dans le framework Yii

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn