我有一个脚本设置,允许我通过 JavaScript 跨两个域进行通信 - from foo.example.com
to 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 中读取。因此,如果我转储会话,它只是一个空白会话外壳。
但是,如果我直接点击第二个实例,然后尝试我的 AJAX 脚本,一切都会按预期工作。这让我相信问题在于阅读 cookie。
有任何想法吗?