我有两个subdomais" api.domain.com"和" web.domain.com"。 现在" web.domain.com"是用html / javascript编写的网页和" api.domain.com"是一个用PHP编写的简单的RESTful API服务器。
" api.domain.com"在标题中设置某些cookie,如下所示
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
setcookie("TestCookie", "Some Value", time()+3600, "/", ".domain.com", 0);
现在,当我从" web.domain.com"进行ajax调用(使用jQuery.ajax())时到" api.domain.com",响应标题包含
Set-Cookie:abc=802691344656c1d0899c4a74.87956617; expires=Mon, 16-May-2016 21:00:09 GMT; path=/; domain=domain.com,
所以我想我应该在客户端浏览器中设置一个cookie,网址为#34; web.domain.com"。
下次我向" api.domain.com"提出另一个请求来自" web.domain.com",不应该将此Cookie作为请求标题的一部分吗?
然而,当我在" api.domain.com"检查$ _COOKIE数组时,我看不到这个cookie!这是否意味着cookie从未在客户端(" web.domain.com")首先设置?我做错了什么?
答案 0 :(得分:0)
使用withCredentials标头(由@charlietfl建议)为我工作。我还必须在服务器中进行一次修改。 所以这就是我的所作所为。 在web.domain.com中,在maqking Ajax请求时,我添加了 withCredentials:true ,就像这样
$.ajax({
// The Url for the request
url : ajaxUrl,
// The data to send (will be converted to a query string)
data : ajaxData,
xhrFields: {
// To allow cross domain cookies
withCredentials: true
},
...
});
在api.domain.com中,我设置了一些这样的标题:
header("Access-Control-Allow-Origin: *");
然而,我仍然无法得到任何回应。我得到了这个错误
Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true.
所以我只需将标题设置为原始域,如下所示:
$http_origin = $_SERVER['HTTP_ORIGIN'];
if (substr($input, -10) == 'domain.com') { // To check if request is always from a subdomain of 'domain.com'
header("Access-Control-Allow-Origin: $http_origin");
}
解决了这个问题。