Разрешить перенос php сессий на поддомен

61

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

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

  • 1
    Сначала ini_set('session.cookie_domain', '.example.com') , затем session_start() или Session::start() из github.com/delight-im/PHP-Cookie.
Теги:
cookies
session

9 ответов

79

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

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

session.cookie_domain = ".example.com"

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

php_value session.cookie_domain .example.com

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

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

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

php_value[session.cookie_domain] = .example.com
  • 2
    К сожалению все 3 не сработали, должна ли быть звезда *?
  • 2
    Очень странно, я использовал эти методы раньше, и они отлично работают. У вас случайно установлен Suhosin, я помню, что нужно было изменить настройки, чтобы это сделать? Если вы этого не сделаете, можете ли вы опубликовать дополнительную информацию о вашей установке (например, apache, lighttpd, php version)?
Показать ещё 8 комментариев
11
        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');

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

  • 2
    это сработало для меня, но я не понимаю проблему безопасности. Не могли бы вы объяснить, какие могут быть проблемы с безопасностью?
5

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

 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 cookie*/
 setcookie( "mysession", "",1,"/" );
 setcookie( "PHPSESSID", "",1,"/" );

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

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

затем проверьте свой браузер на наличие файлов cookie, просто удалите все куки домена и поддомена и повторите процесс.

  • 0
    Это сделало работу за меня. Ни один из других ответов на этот вопрос не сработал.
4

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

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

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

  • 0
    Это злой, отладка уже 2 часа, так как совместное использование сеансов работало нормально в моей локальной среде. должен был проверить настройки Suhosin ранее
3

Другой вариант, который работал у меня: заключается в том, чтобы вызывать имя сеанса:

session_name("myWebsite");
session_start(); 
  • 0
    На сегодняшний день это кажется самым простым решением
2

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

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

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

Попробуй это:

session_start(); 

$sessionId =  session_id();

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

$sessionId =  $_GET['id'];

session_start($sessionId); 

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

  • 3
    Если ваш ответ начинается с «попробуйте», вы делаете это неправильно.
0

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

-2
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');

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню