我有一个脚本设置,允许我通过JavaScript在两个域之间进行通信 - 从foo.example.com
到bar.example.com
。
当跨域请求到达我的服务器时,我确保如下设置Access Control Headers
(在Kohana中):
$this->response->headers('Access-Control-Allow-Origin', 'foo.example.com'));
$this->response->headers('Access-Control-Allow-Credentials', 'true');
$this->response->headers('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
我还确保Kohana知道我想在子域之间共享我的cookie:
Cookie::$expiration = 60 * 60 * 24 * 14;
Cookie::$salt = 'salt-string-which-is-the-same-on-both-domains';
Cookie::$httponly = TRUE;
Cookie::$domain = '.example.com';
我已将JavaScript设置为使用单个域(因为我也有iframe跨域):
document.domain = "example.com";
我在发出xhrFields
次请求时也使用$.ajax()
属性:
xhrFields: {
withCredentials: true
}
问题
我遇到的问题是,当我完全使用它来执行跨域AJAX请求时,第二个实例bar.example.com
上的会话不会从发送给它的cookie中读取。因此,如果我转储会话,它只是一个空白的会话shell。
但是,如果我直接点击第二个实例然后尝试我的AJAX脚本,一切都按预期工作。这让我相信问题在于阅读cookie。
有什么想法吗?
答案 0 :(得分:0)
我相信我找到了造成这个问题的原因。由于两个域都由单独的实例提供服务,因此它们具有独特的PHP环境。我的代码目前正在使用本机PHP会话 - 所以当cookie被发送到第二台服务器时,它会获得没有数据分配的ID。
只有通过手动访问站点才能触发数据分配,因为它会自动运行身份验证和授权过程。我将切换到在Kohana中使用数据库会话。两个实例都指向同一个DB,因此这应解决问题。
我会在这里回复确认。