我不确定这是否可行。
我公司的主要网站接受信用卡和其他付款信息。他们还有其他网站与我们托管的活动直接相关。例如,我们的主要网站是:
但是有另一个专门针对年度活动的网站:
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
页面会查找上面的地址会话变量。
答案 0 :(得分:24)
会话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
}
});
});