Общий сеанс через домены

Хорошо... У меня есть два домена example.com и example.net, они имеют одинаковое кодовое пространство и сеансы. Проблема в том, что домен должен меняться, когда пользователь меняет язык, когда это происходит, все данные сеанса теряются. Я хочу сделать ajax-вызов прямо перед этим, чтобы я мог изменить сеанс. Вот код, который используется для инициализации сеанса.

<?php 
    /* This method is invoked */
    public function start($session_id = '', $key = 'default') {
        if (!session_id()) {
            ini_set('session.use_only_cookies', 'Off');
            ini_set('session.use_cookies', 'On');
            ini_set('session.use_trans_sid', 'Off');
            ini_set('session.cookie_httponly', 'On');

            if ($session_id) {
                session_id($session_id);
            }   

            if (isset($_COOKIE[session_name()]) && !preg_match('/^[a-zA-Z0-9,\-]{22,52}$/', $_COOKIE[session_name()])) {
                exit('Error: Invalid session ID!');
            }

            session_set_cookie_params(0, '/');
            session_start();
        }

        if (!isset($_SESSION[$key])) {
            $_SESSION[$key] = array();
        }

        $this->data =& $_SESSION[$key]; 

        return true;            
    }

Я попытался создать автономный скрипт для обработки вызова ajax, но он не сработал.

<?php 
    ini_set('session.use_only_cookies', 'Off');
    ini_set('session.use_cookies', 'On');
    ini_set('session.use_trans_sid', 'Off');
    ini_set('session.cookie_httponly', 'On');


    session_set_cookie_params(0, '/');
    session_start();
    session_id($_POST['session_id']);


    header('Content-Type: application/json');
    $data = array('session_id' => session_id());
    echo json_encode($data);

Сеанс не сохраняется при переключении между двумя доменами. Есть какие-нибудь подсказки?

1 ответ

Решение

Это функция безопасности веб-браузеров - сеанс использует куки-файл, который прикреплен к домену, и браузер не будет отправлять этот куки-файл в другой домен.

Контролируя оба домена, вы можете достичь этого, включив информацию об аутентификации в URL. Это сложная тема. Вы можете сделать что-то домашнее, что сработает, но если вы не знакомы с проблемами безопасности, вам лучше использовать готовое решение с единым входом.

Другие вопросы по тегам