2016-02-15 86 views
0

我有兩個subdomais「api.domain.com」和「web.domain.com」。 現在「web.domain.com」是用html/javascript編寫的網頁,「api.domain.com」是一個簡單的用PHP編寫的寧靜的API服務器。在頭不是由另一個子域設置的標頭cookie?

「api.domain.com」 設置某些Cookie如下

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

現在,當我讓調用Ajax(使用jQuery.ajax())從 「web.domain.com」以「api.domain.com」時,響應頭包含

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

所以我想一個cookie應在客戶端瀏覽器在「web.domain.com」進行設置。

下一次我向「web.domain.com」發出另一個請求到「api.domain.com」時,不應該將此cookie作爲請求請求的一部分嗎?

但是,當我檢查「api.domain.com」中的$ _COOKIE數組時,我看不到這個cookie!這是否意味着cookie從未在客戶端(「web.domain.com」)首次被設置?我究竟做錯了什麼?

+0

首先,您應該檢查瀏覽器工具在哪裏設置了哪些cookie。 – jeroen

+2

Cookie不會發送到跨域,除非您使用withCredentials標頭 – charlietfl

+0

此外,'.domain.com'不是有效的域名。 – Cristy

回答

0

使用withCredentials標頭(由@charlietfl建議)爲我工作。我還必須在服務器上再做一次修改。 這就是我所做的。 在web.domain.com,而maqking Ajax請求,我加withCredentials:真,這樣

$.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"); 
} 

這固定的問題。

相關問題