web-dev-qa-db-fra.com

Autoriser les sessions php à se reporter aux sous-domaines

J'utilise des sessions php (pas les cookies, à l'exception du cookie d'identification de session) pour toutes les données utilisateur. Lorsqu'un utilisateur accède à son profil user.mydomain.com, il est immédiatement "déconnecté" jusqu'à ce qu'il supprime le sous-domaine.

Existe-t-il un moyen d’accepter des sessions de tous les domaines aussi longtemps que son * .mydomain.com

65
Anthony

Voici 4 options.

Placez ceci dans votre php.ini:

session.cookie_domain = ".example.com"

Ou dans votre .htaccess:

php_value session.cookie_domain .example.com

Ou comme la première chose dans votre script:

ini_set('session.cookie_domain', '.example.com' );

Ou dans la configuration de votre pool php-fpm pour votre site:

php_value[session.cookie_domain] = .example.com
80
CTT
        if(isset($_COOKIE['session_id']))
            session_id($_COOKIE['session_id']);
        Zend_Session::start(); //or session_start();
        if(!isset($_COOKIE['session_id']))
            setcookie('session_id', session_id(), 0, '/', '.yourdomain.com');

que la sécurité soit maudite, si vous êtes aussi frustré que moi par des réponses incomplètes ou mauvaises, ceci est votre sauveur. Ça fonctionne.

12
sucitivel

change le nom de la session en haut du fichier des fonctions principaleslike

 session_name('mysession');

puis utilisez le code suivant dans la page php

  session_set_cookie_params(0,"/",".example.com",FALSE,FALSE);
  setcookie(session_name(), session_id(),0,"/","example.com");
  session_start();

enfin, modifiez le nom de session par défaut du sous-domaine et supprimez le cookie par défaut dans le fichier de fonctions de base du sous-domainelike:

 /*default session name*/
 session_name("mysession");
 /*remove the PHPSESSID and default session name from subdomain's cookie*/
 setcookie( "mysession", "",1,"/" );
 setcookie( "PHPSESSID", "",1,"/" );

si vous continuez à utiliser votre nom de cookie en tant que PHPSESSID, supprimez toutes les fonctions avec 

 "mysession" string like session_name('mysession'), setcookie( "mysession", "",1,"/" );

puis vérifiez les cookies existants de votre navigateur, supprimez simplement tous les cookies du domaine et du sous-domaine, et répétez le processus.

5
karthikeyan ganesan

Je sais que c'est assez ancien - mais pour développer la suggestion de @ CTT - j'avais besoin d'ajouter un fichier php.ini dans chaque sous-répertoire (qui exécutera du code php et nécessite la session) de mon sous-domaine avec le texte suivant:

suhosin.session.cryptdocroot=Off
suhosin.cookie.cryptdocroot=Off

J'espère que cela aide (il m'a fallu des siècles pour comprendre cela).

4
joeldixon66

oui. ini_set fonctionne. mais rappelez-vous de détruire tous les caches et les cookies du navigateur pour voir son fonctionnement.

  1. détruire tous les caches et les cookies de votre navigateur
  2. dans votre xxx.example.com et yyy.example.com, vos fichiers php devraient commencer comme ceci. 

    ini_set('session.cookie_domain', '.example.com' ); session_start();
    
3
Wikum Ekanayake

Une autre option qui a fonctionné pour moi est de forcer le nom de la session: 

session_name("myWebsite");
session_start(); 
3
Laurent Duvergé

Je viens d'avoir ce problème et il s'avère que j'utilisais différents fichiers php.ini pour deux sous-domaines différents. Ces fichiers ini spécifiaient différents session.save_path variables. Pour des raisons évidentes, il doit être identique pour tous les sous-domaines devant partager des sessions.

0
Mike

Essaye ça:

session_start(); 

$sessionId =  session_id();

connecté l'utilisateur. Lorsque l’utilisateur passera à un autre sous-domaine, l’identifiant de session dans l’URL sera le même que celui-ci user.mydomain.com/?id=$sessionId

$sessionId =  $_GET['id'];

session_start($sessionId); 

Maintenant, l'utilisateur obtiendra toutes les valeurs de la session et restera connecté.

0
abrar