【问题标题】:Header cookies not being set by another subdomain?标题cookie不是由另一个子域设置的?
【发布时间】:2016-02-15 13:30:26
【问题描述】:

我有两个子域“api.domain.com”和“web.domain.com”。 现在“web.domain.com”是用html/javascript编写的网页,“api.domain.com”是一个用php编写的简单的restful API服务器。

“api.domain.com”在头部设置某些cookies如下

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
setcookie("TestCookie", "Some Value", time()+3600, "/", ".domain.com", 0);

现在,当我从“web.domain.com”到“api.domain.com”进行 ajax 调用(使用 jQuery.ajax())时,response 标头包含

Set-Cookie:abc=802691344656c1d0899c4a74.87956617; expires=Mon, 16-May-2016 21:00:09 GMT; path=/; domain=domain.com,

所以我猜应该在“web.domain.com”的客户端浏览器中设置一个cookie。

下次我从“web.domain.com”向“api.domain.com”发出另一个请求时,这个 cookie 不应该作为 request 标头的一部分吗?

但是,当我在“api.domain.com”检查 $_COOKIE 数组时,我没有看到这个 cookie!这是否意味着 cookie 一开始就没有在客户端(“web.domain.com”)中设置?我做错了什么?

【问题讨论】:

  • 首先,您应该在浏览器工具中检查哪些 cookie 设置在哪里。
  • cookie 不会跨域发送,除非您使用 withCredentials 标头
  • 另外,.domain.com 不是有效的域名。
  • @charlietfl :我应该在哪里设置 withCredentials 标头?在请求或响应中?在我已经设置的响应中: header("Access-Control-Allow-Credentials: true");
  • @Cristy ,“。”是一个错字。我正在设置“domain.com”

标签: javascript php jquery ajax cookies


【解决方案1】:

使用 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");
}

这解决了问题。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2022-09-23
    相关资源
    最近更新 更多