22

我不确定这是否可能。

我公司的主要网站接受信用卡和其他付款信息。他们还有其他与我们举办的活动直接相关的网站。例如我们的主站点是这样的:

http://www.etm124biz.com

但是有另一个专门用于年度活动的网站:

http://www.etm124annualgala.com

我的“事件”站点正在处理注册并保存到我们的数据库,但我们的主站点处理信用卡处理。在主网站上处理当前购买时,会话用于将数据传递到支付/抄送屏幕。

无需更改我的付款代码(例如,接受 $_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页面查找上面的地址会话变量。

4

3 回答 3

27

跨域会话 ID

默认情况下,会话 ID 使用 cookie 传递。由于您的网站位于不同的域上,因此会话 cookie 不会传输过来,因此这是阻止跨域会话工作的一件事。

传递会话 ID 的一种技术是将它们附加到所有请求的查询字符串中(PHP 甚至对此有一定程度的内置支持)。然而,这种做事方式有许多缺点——最重要的是人们一直在复制/粘贴 URL,这意味着揭示有效和重用无效会话 id——因此不推荐使用

更好的方法是使用 Javascript 跨所有感兴趣的域发出跨域请求(当然这需要合作)。通过这种方式,您可以根据需要在任意数量的服务器之间无缝传输会话 ID。

共享会话数据

即使 cookie 没有问题,您也需要将会话数据保存在所有服务器通常可以访问的某个存储上。默认存储是本地文件系统,所以如果你想要跨域会话,这也是需要改变的。

此问题的一个简单解决方案是使用自定义会话处理程序,将数据存储在数据库或其他全局可访问的存储中。

于 2013-01-30T18:54:10.870 回答
4

现在回答这个问题已经很晚了,但是由于我遇到了这个问题,即使经过数十个小时并搜索谷歌也找不到解决方案,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
    }
  });
});
于 2017-03-10T08:36:56.380 回答
2

这个问题确实探索了很多。

于 2013-01-30T19:00:04.497 回答