Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Сеансы PHP в поддоменах

Автор вопроса: dragonmantankОтветов: 12

Я пытаюсь настроить следующее:

auth.example.com
sub1.example.com
sub2.example.com

Если пользователь посещает sub1.example.com или sub2.example.com и не вошел в систему, он перенаправляется на auth.example.com и может войти в систему.

sub1.example.com и sub2.example.com - два разных приложения, но используют одни и те же учетные данные.

Я попытался установить в своем php.ini следующее:

session.cookie_domain = ".example.com"

но похоже, что он не передает информацию из одного домена в другой.

[Изменить]

Я пробовал следующее:

sub1.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.example.com/test.php">Change Sites</a>'

auth.example.com/test.php

session_set_cookie_params(0, '/', '.example.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);

Идентификаторы сеанса точно такие же, но когда я выгружаю переменную $_SESSION, она не показывает оба ключа, а только тот ключ, который я установил для каждого домена.

  • Вы также должны включить его в своем коде, см. http://us2.php.net/manual/en/function.session-set-cookie-params.php Residuum 30.06.2009
  • У меня почти такая же настройка (я установил домен cookie сеанса с помощью вызова session_set_cookie_params), и он отлично работает. Milen A. Radev 30.06.2009
  • Вот хорошая функция, которая работает stackoverflow.com / questions / 2835486 / boksiora 14.07.2013

authenticationphpsessioncross-domain

Ответы

Ответ 1 · рейтинг 138 · jeroen

Я не знаю, существует ли проблема, но я просто столкнулся с той же проблемой и решил ее, установив имя сеанса перед вызовом session_set_cookie_params():

$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.example.com');
session_start();

Я ничего не менял в своем php.ini, но теперь все работает нормально.

Ответ 2 · рейтинг 24 · drewm

Одна вещь, которая может загадочным образом предотвратить чтение данных сеанса на поддомене, несмотря на то, что файлы cookie правильно установлены на .example.com, - это патч PHP Suhosin. Вы можете настроить все правильно, как показано в примерах в вопросе, и это может просто не работать.

Отключите следующие настройки сеанса Suhosin, и вы снова в деле:

suhosin.session.cryptua = Off
suhosin.session.cryptdocroot = Off

Ответ 3 · рейтинг 5 · George Claghorn

Попробуйте использовать:

session.cookie_domain = "example.com"

Вместо:

session.cookie_domain = ".example.com"

Обратите внимание на пропущенный период в начале.

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

Ответ 4 · рейтинг 4 · Valentin Florea

Была эта точная проблема - я хотел, чтобы значения сеанса, созданные в x.example.local, были доступны в example.local и наоборот.

Во всех найденных мною решениях говорится об изменении домена сеанса с помощью php_value session.cookie_domain .example.local в .htaccess (или через php.ini или через ini_set).

Уловка заключалась в том, что я устанавливал session.cookie_domain для всех поддоменов (пока нормально), но также и для основного домена. Очевидно, что установка session.cookie_domain в основном домене - это недопустимо.

В основном, как это сработало для меня:

  • установите session.cookie_domain для ВСЕХ ПОДдоменов.
  • не устанавливайте его для основного ДОМЕНА

О да, пожалуйста, убедитесь, что у домена есть TLD (в моем случае .local). Протокол Http не позволяет хранить файлы cookie / сеансы в домене без .tld (то есть localhost не будет работать, но stuff.localhost будет).

РЕДАКТИРОВАТЬ. Также убедитесь, что вы всегда очищаете файлы cookie своего браузера во время тестирования / отладки сеансов на поддоменах. Если вы этого не сделаете, ваш браузер всегда будет отправлять старый файл cookie сеанса, для которого, вероятно, еще не установлен правильный cookie_domain. Сервер восстановит старую сессию, поэтому вы получите ложноотрицательные результаты. (во многих сообщениях упоминается использование session_name ('stuff') для того же эффекта)

Ответ 5 · рейтинг 3 · xtds

Я решил это вот так

ini_set('session.cookie_domain', '.testdomain.example');
session_start();

Потому что я работал на localhost

ini_set('session.cookie_domain', '.localhost');

не работает, он видит .localhost как верхний уровень вместо .com / .local / ... (я подозреваю)

Ответ 6 · рейтинг 3 · Terry Lin

Я подтвердил. joreon ответ правильный. Я не могу комментировать, потому что моей репутации недостаточно, поэтому я размещаю свой комментарий здесь.

Определите константу в файле конфигурации. Если вы хотите его изменить, не нужно изменять файлы целиком.

define('ROOT_DOMAIN',   'mysite.example');
define('PHP_SESSION_NAME', 'MYSITE');

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

Используйте следующий код, чтобы начать использовать сеанс

session_name(PHP_SESSION_NAME);
session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
session_start();

Я использую эту функцию:

function load_session() {
    if (session_status() == PHP_SESSION_NONE) {
        session_name(PHP_SESSION_NAME);
        session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
        session_start();
    } elseif (session_name() != PHP_SESSION_NAME) {
        session_destroy();
        session_name(PHP_SESSION_NAME);
        session_set_cookie_params(0, '/', '.' . ROOT_DOMAIN);
        session_start();
    }
}
load_session(); // put it in anywhere you want to use session

Ответ 7 · рейтинг 2 · tellnobody

Используйте его на каждом домене / субдомене:

session_name('name');
ini_set('session.cookie_domain', '.example.com');
ini_set('session.save_path', '/var/lib/php/session');
session_start();

Путь для session.save_path в вашем случае может быть другим, но он должен быть одинаковым для каждого домена / субдомена. По умолчанию это не всегда так.

Ответ 8 · рейтинг 1 · Ivan

Используйте это, это работает:

ini_set('session.cookie_domain',
    substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));

Ответ 9 · рейтинг 1 · Limitless isa

Совместное использование сеансов cookie субдомена и корневого домена

Ресурс: http://php.net//manual/tr/function.session-set-cookie-params.php

Я тестировал работы

sub.example.com/sessionadd.php?id=123

example.com/sessionview.php // 123

- коды

<?php
$currentCookieParams = session_get_cookie_params();

$rootDomain = '.example.com';

session_set_cookie_params(
    $currentCookieParams["lifetime"],
    $currentCookieParams["path"],
    $rootDomain,
    $currentCookieParams["secure"],
    $currentCookieParams["httponly"]
);

session_name('mysessionname');
session_start();

setcookie($cookieName, $cookieValue, time() + 3600, '/', $rootDomain);
?>

Ответ 10 · Thomas

Я понимаю, что вам не нужно что-то вроде OpenID, как предлагает Джоэл, но вы хотите иметь доступ к данным сеанса в нескольких доменах.

Единственная возможность, которую я могу рассматривать как решение этой проблемы, - это сохранить данные сеанса в базе данных и вытащить их из этой базы данных.

Ответ 11 · Willian Santana

У меня была аналогичная проблема, однако это решение было для меня хорошим, возможно, поможет другим в будущем

отредактируйте php.ini

session.cookie_domain = ".example.com"

магия здесь

suhosin.session.cryptdocroot = Off

suhosin.cookie.cryptdocroot = Off

https://www.sitepoint.com/community/t/sessions-across-subdomains-domain-com-phpsessid-changes/3013/19.

Ответ 12 · user3232196

Я не могу говорить о других версиях PHP, но в 5.6.6 простая установка значения session.cookie_domain в файле php.ini позволила всем моим поддоменам на iPage использовать один и тот же набор переменных сеанса.

Обязательно удалите из браузера все существующие файлы cookie, относящиеся к вашему домену, для проверки.

session.cookie_domain = '.yourdomainname.example'

О, не знаю, имеет ли это значение, но я также использую автозапуск сеанса.

session.auto_start = 1

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы