我有一个脚本设置,允许我通过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";
在进行$.ajax()
请求时,我还使用xhrFields
属性:
xhrFields: {
withCredentials: true
}
问题
我遇到的问题是,当我使用它来执行跨域AJAX请求时,第二个实例bar.example.com
上的会话不会从发送给它的cookie中读取。因此,如果我转储会话,它只是一个空白的会话外壳。
然而,如果我直接访问第二个实例,然后尝试我的AJAX脚本,一切都会按预期进行。这让我相信问题出在阅读cookie上。
有什么想法吗?
我相信我已经找到了导致此问题的原因。因为这两个域都由单独的实例提供服务,所以它们运行着独特的PHP环境。我的代码目前使用的是原生PHP会话,所以当cookie被发送到第二台服务器时,它会得到没有分配数据的ID。
只有手动访问网站才能触发数据分配,因为它会自动运行身份验证和授权程序。我将切换到使用Kohana中的数据库会话。两个实例都指向同一个DB,因此这应该可以解决问题。
我会寄回这里确认。