Разрешить перенос php сессий на поддомен - PullRequest
67 голосов
/ 14 марта 2009

Я использую php-сессии (не cookie-файлы, кроме cookie-идентификатора сессии) для всех пользовательских данных, и когда пользователь заходит в свой профиль user.mydomain.com, он сразу же «выходит из системы», пока не удалит поддомен. *

Есть ли способ принимать сеансы со всех доменов, если его * .mydomain.com

Ответы [ 9 ]

81 голосов
/ 14 марта 2009

Вот 4 варианта.

Поместите это в свой php.ini:

session.cookie_domain = ".example.com"

Или в вашем .htaccess:

php_value session.cookie_domain .example.com

Или как первое, что в вашем сценарии:

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

Или в конфигурации пула php-fpm для вашего сайта:

php_value[session.cookie_domain] = .example.com
12 голосов
/ 24 февраля 2012
        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');

будь проклят безопасность, если ты так же разочарован неполными или плохими ответами, как и я, это твой спаситель. Это просто работает.

5 голосов
/ 18 января 2016

изменить имя сеанса вверху файла основных функций как

 session_name('mysession');

затем используйте следующий код на странице php

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

наконец измените имя сеанса по умолчанию для субдомена и удалите файл cookie по умолчанию в файле основных функций субдомена как:

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

если вы продолжите использовать имя куки в качестве PHPSESSID, просто удалите все функции с помощью

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

Затем проверьте существующие куки вашего браузера, просто удалите все куки домена и субдомена и повторите процесс.

4 голосов
/ 11 февраля 2014

Я знаю, что это довольно старое - но для дальнейшего расширения предложения @ CTT - мне нужно было добавить файл php.ini в каждый подкаталог (который будет выполнять код php и требует сеанса) моего субдомена с помощью следующий текст:

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

Надеюсь, это поможет (мне понадобились годы, чтобы понять это).

3 голосов
/ 24 марта 2016

да. ini_set работает. но не забудьте уничтожить все кэши и файлы cookie браузера, чтобы убедиться, что он работает.

  1. уничтожить все кэши и файлы cookie вашего браузера
  2. в ваших xxx.example.com и yyy.example.com ваши php-файлы должны начинаться следующим образом.

    ini_set('session.cookie_domain', '.example.com' ); session_start();
    
3 голосов
/ 13 июля 2014

Еще один вариант, который работал для меня: принудительно ввести имя сеанса:

session_name("myWebsite");
session_start(); 
0 голосов
/ 06 апреля 2018

Попробуйте:

session_start(); 

$sessionId =  session_id();

вошел в систему пользователя. Когда пользователь будет переключаться на другой поддомен, отправляется идентификатор сеанса в URL, например, user.mydomain.com/?id=$sessionId

$sessionId =  $_GET['id'];

session_start($sessionId); 

Теперь пользователь получит все значения сеанса и останется в системе.

0 голосов
/ 03 ноября 2014

У меня просто была эта проблема, и оказалось, что я использовал разные файлы php.ini для двух разных поддоменов. В этих ini-файлах указаны разные переменные session.save_path . По понятным причинам это должно быть одинаковым для всех поддоменов, которые должны совместно использовать сеансы.

0 голосов
/ 10 января 2013
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');

Это хорошее решение, но вы не можете использовать его во всех ситуациях. Например, он не будет работать, если вы не можете полагаться на несессионные куки.

Это на самом деле ДОЛЖНО работать, если вы используете его правильно.

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

Например, вам нужно поставить его перед session_start(), а также во всех файлах, которые вызывают session_start()

...