保留不同域中的会话变量

时间:2013-01-30 18:51:58

标签: php

我不确定这是否可行。

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

http://www.etm124biz.com

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

http://www.etm124annualgala.com

我的'活动'网站正在处理注册并保存到我们的数据库,但我们的主网站处理信用卡处理。在主网站上处理当前购买时,会话用于将数据传递到付款/ 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页面会查找上面的地址会话变量。

3 个答案:

答案 0 :(得分:24)

跨域会话ID

会话ID默认使用Cookie传递。由于您的网站位于不同的域中,因此会话cookie不会转移,因此这是阻止跨域会话工作的一件事。

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

更好的方法是使用Javascript在所有感兴趣的域中进行跨域请求(当然这需要合作)。这样,您就可以根据需要在任意数量的服务器上无缝转移会话ID。

共享会话数据

即使cookie不是问题,您也需要在所有服务器上都可以访问某些存储上的会话数据。默认存储是本地文件系统,因此如果您需要跨域会话,这也需要更改。

解决此问题的一个简单方法是使用custom session handler将数据存储在数据库或其他全局可访问的商店中。

答案 1 :(得分:3)

答案 2 :(得分:1)

回答这个问题已经很晚了但是因为我已经遇到了这个问题,即使经过几十个小时搜索google也无法找到解决方案,堆栈溢出全部但却没有成功。但现在我终于找到了问题和解决方案。

服务器端

对于跨域PHP会话,我们需要执行以下操作

  

第1步

首先,我们需要在php收到请求的主域中的.htAccess中设置这些行

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。如果您有SSL连接,则可以设置https

  

第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
    }
  });
});