保留不同域中的会话变量

etm*_*124 19 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);
Run Code Online (Sandbox Code Playgroud)

我的payment.php页面查找上面的地址会话变量.

Jon*_*Jon 24

跨域会话ID

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

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

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

共享会话数据

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

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

  • @ hek2mgl:对不起,那是个笨蛋.如果你真的相信那么你就不会对这个"太重要"的问题留下两行答案. (4认同)

Abd*_*rai 6

现在回答这个问题已经很晚了,但是因为我遇到了这个问题,即使经过数十个小时并搜索谷歌、stackoverflow 也找不到解决方案,但还没有成功。但现在我终于找到了问题所在以及解决方案。

服务器端

对于跨域 PHP 会话,我们需要做以下事情

步骤1

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

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"
Run Code Online (Sandbox Code Playgroud)

上面这些行告诉仅允许来自http://m.example.com的请求。注意我已经设置了http。您可以设置https是否有 SSL 连接。

第2步

您必须先允许 PHP 为不同的子域共享相同的会话session_start()

ini_set('session.cookie_domain', '.example.com');
session_start();
Run Code Online (Sandbox Code Playgroud)

如果您有权访问,php.ini然后在那里设置一次,那么您将不需要在 PHP 文件中设置以上行。

客户端

最后,您必须告诉浏览器使用 发出请求Cross-Domain。就像在 JQuery 中一样

$(document).ready(function()
{
  $.ajaxSetup({
    crossDomain: true,
    xhrFields: {
        withCredentials: true
    }
  });
});
Run Code Online (Sandbox Code Playgroud)