两台服务器,同一个域名,无法获取cookies

Posted

技术标签:

【中文标题】两台服务器,同一个域名,无法获取cookies【英文标题】:Two servers, same domain name, can't get cookies 【发布时间】:2017-06-30 16:58:30 【问题描述】:

标题说明了一切,我无法弄清楚为什么我无法从同一域上的两个不同服务器获取或设置 cookie。将$path 设置为/$domain 指定为127.0.0.1$secure 设置为false$httponly 设置为false

下面是更详细的情况:

服务器 1 - 127.0.0.1

Server 1 我有一个php 脚本,如果设置了cookie,它会获取一个cookie,然后设置一个新的cookie。然后将新旧 cookie 值作为 JSON 返回。

服务器 2 - 127.0.0.1:8000

在具有相同域名但端口不同的Server 2 上,我有一个html 文件从Server 1 请求脚本。我无法获取 cookie,或从Server 2 设置一个新的。

这里是文件:

Server 1上的 PHP 脚本

<?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);

Server 2上的 HTML 文件

<!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>

“这到底是怎么回事?!”

【问题讨论】:

【参考方案1】:

虽然两台服务器具有相同的主机名,但它们具有不同的端口,因此它们的来源不同。并且浏览器不会让你设置 cookie 跨域。

只有当它们具有相同的方案、主机名和端口时,两个源才被认为是相同的。

【讨论】:

即使执行 cookie 设置的脚本总是在同一个域和端口上,只是从其他地方访问? 就来源限制而言,服务器端发生的事情并不重要,因为浏览器看不到这一点。对于来源限制,唯一相关的是前端客户端发生的事情。因此,如果源 A 的 Web 应用程序设置了 cookie,则源 B 的 Web 应用程序无法访问这些 cookie — 即使两个 Web 应用程序的源托管在后端完全相同的服务器上。

以上是关于两台服务器,同一个域名,无法获取cookies的主要内容,如果未能解决你的问题,请参考以下文章

cookie

js中cookie可以跨域取值吗

axios 跨域请求允许带cookie,则服务器Access-Control-Allow-Origin应设置为具体域名,否则请求无法获得返回数据

新版本浏览器跨站cookie 获取问题

Cookie跨域实现单点登录

Node中的Cookie和Session