Сохранение переменных сеанса в разных доменах
Я не уверен, что это возможно.
У моей компании есть свой основной сайт, который принимает кредитные карты и другую платежную информацию. У них также есть другие сайты, которые напрямую связаны с событиями, которые мы принимаем. Например, наш главный сайт выглядит примерно так:
http://www.etm124biz.com
Но есть другой сайт специально для ежегодного события:
http://www.etm124annualgala.com
Мой сайт "event" обрабатывает регистрацию и сохраняет в нашей базе данных, но наш основной сайт обрабатывает обработку кредитных карт. При текущих покупках, обрабатываемых на основном веб-сайте, сеансы используются для передачи данных на экраны оплаты /cc.
Не меняя моего платежного кода (чтобы принимать, скажем, параметры $_GET), не должны ли меняться переменные $_SESSION
?
Пример:
$_SESSION['s_address1'] = $_POST['address1'];
$_SESSION['s_address2'] = $_POST['address2'];
$_SESSION['s_city'] = $_POST['city'];
$_SESSION['s_state'] = $_POST['state'];
$_SESSION['s_zip'] = $_POST['zip'];
header('Location: https://www.etm124biz.com/payment.php?oid=' . $oid . '&src=conf&id=' . $seq);
Моя страница payment.php
ищет переменные сеанса адреса выше.
Ответы
Ответ 1
Идентификаторы сеанса междоменной сессии
Идентификаторы сеансов передаются с использованием файлов cookie по умолчанию. Поскольку ваши веб-сайты находятся в разных доменах, cookie сеанса не переносится, так что одна вещь, которая препятствует работе междоменных сессий.
Один из методов, позволяющих переносить идентификаторы сеансов, заключается в том, чтобы добавить их в строку запроса всех ваших запросов (PHP даже имеет некоторую степень встроенной поддержки для этого). Однако этот способ делать вещи имеет много недостатков - самое главное, что люди копируют/вставляют URL-адреса все время, со всем, что подразумевает раскрытие действительного и повторного использования недопустимых идентификаторов сеанса, и поэтому не рекомендуется.
Намного лучше было бы использовать Javascript для создания междоменных запросов по всем заинтересованным доменам (для чего, конечно же, нужно было бы сотрудничать в этом). Таким образом, вы можете без проблем передавать свой идентификатор сеанса на столько серверов, сколько вам нужно.
Общие данные сеанса
Даже если файл cookie не был проблемой, вам нужно будет иметь данные сеанса на каком-то хранилище, обычно доступном для всех ваших серверов. По умолчанию хранилище - это локальная файловая система, поэтому снова это нужно изменить, если вы хотите выполнять междоменные сеансы.
Простым решением этой проблемы будет использование специализированного обработчика сеанса , в котором хранятся данные в базе данных или в другом глобально доступном хранилище.
Ответ 2
у этого вопроса есть ответ для ir.
и этот вопрос очень часто исследует предмет.
Ответ 3
Поздно, чтобы ответить на этот вопрос, но поскольку я столкнулся с этой проблемой и не смог найти решение даже после десятков часов и поиска google, stackoverflow на всем протяжении, но все же не имел успеха. Но теперь, наконец, я выяснил проблему и решение для нее.
СЕРВЕРНАЯ СТОРОНА
Для междоменных сеансов PHP нам нужно выполнить следующие действия
Шаг 1
Прежде всего, нам нужно установить эти строки в .htAccess
в нашем основном домене, где php получает запрос
SetEnvIf Origin ^(http?://m\.example\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN
Header set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header set Access-Control-Allow-Credentials true
Header set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
Эти строки указывают, что разрешать запросы от http://m.example.com. Обратите внимание, что я установил http
. Вы можете установить https
, если у вас есть SSL-соединение.
Шаг 2
Вы должны разрешить PHP использовать одни и те же сеансы для разных поддоменов до session_start()
ini_set('session.cookie_domain', '.example.com');
session_start();
Если у вас есть доступ к php.ini
, то установите его один раз там, тогда вам не нужно будет устанавливать строки выше в ваших файлах PHP.
КЛИЕНТСКАЯ СТОРОНА
И последнее, вы должны сообщить Браузеру сделать запрос с помощью Cross-Domain
. Как в JQuery
$(document).ready(function()
{
$.ajaxSetup({
crossDomain: true,
xhrFields: {
withCredentials: true
}
});
});