标头Cookie未被其他子域设置?

时间:2016-02-15 13:30:27

标签: javascript php jquery ajax cookies

我有两个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")首先设置?我做错了什么?

1 个答案:

答案 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");
}

解决了这个问题。