2017-02-12 84 views
1

標題說明了這一切,我無法弄清楚爲什麼我無法從同一個域上的兩臺不同服務器獲取或設置Cookie。用$path設置爲/,$domain指定爲127.0.0.1,$secure設置false$httponly設置false兩臺服務器,相同的域名,不能得到餅乾

下面是詳細情況:

服務器1 - 127.0.0.1

Server 1我有一個PHP腳本,得到它是否設置cookie,並設置一個新的Cookie。然後舊的和新的cookie值作爲JSON返回。

服務器2 - 127.0.0.1:8000

Server 2使用相同的域名,但不同的端口,我有一個從Server 1請求腳本的HTML文件。我無法獲取cookie,或從Server 2設置新的cookie。

以下是文件:關於Server 1

<?php 

header ('Access-Control-Allow-Origin: *'); 

$old = !empty ($_COOKIE['test']) ? $_COOKIE['test'] : 'none'; 
$new = rand (0, 1000); 

setcookie ('test', $new, time() * 2, '/', '127.0.0.1', false, false); 

echo json_encode ('old: ' . $old . ' new: '. $new); 

HTML文件

PHP腳本Server 2

<!DOCTYPE html> 

<html> 
    <head> 
     <meta charset="utf-8"> 
     <title></title> 

     <script type="text/javascript"> 
      var test = new XMLHttpRequest(); 

      test.onreadystatechange = function() 
      { 
       if (this.readyState !== 4 || this.status !== 200) { 
        return; 
       } 

       document.body.innerHTML = JSON.parse (this.responseText); 
      }; 

      test.open ('POST', 'http://127.0.0.1/cookieget.php', true); 
      test.send(); 
     </script> 
    </head> 

    <body></body> 
</html> 

「到底是什麼回事? 「

回答

3

雖然兩臺服務器具有相同的主機名,但它們有不同的端口,因此它們的來源不同。而瀏覽器不會讓你設置cookie的交叉來源。

只有兩個來源具有相同的方案,主機名和端口時,才認爲兩個來源相同。

+0

即使執行cookie設置的腳本始終位於相同的域和端口上,只是從別處訪問? –

+0

只要起源限制發生,服務器端發生的事情並不重要,因爲瀏覽器沒有看到。對於原始限制,唯一相關的是前端客戶端發生的情況。因此,如果在源A的Web應用程序設置了cookie,源B的Web應用程序無法訪問這些cookie,即使兩個Web應用程序的源託管在後端的同一臺服務器上。 – sideshowbarker