Cookies 本地主机上具有显式域的Cookie

Cookies 本地主机上具有显式域的Cookie,cookies,setcookie,Cookies,Setcookie,我一定错过了一些关于饼干的基本知识。在localhost上,当我在服务器端设置cookie并显式地将域指定为localhost(或.localhost)时。某些浏览器似乎不接受cookie Firefox 3.5:我在Firebug中检查了HTTP请求。我看到的是: Set-Cookie: name=value; domain=localhost; expires=Thu, 16-Jul-2009 21:25:05 GMT; path=/ 或者(当我将域设置为.

我一定错过了一些关于饼干的基本知识。在localhost上,当我在服务器端设置cookie并显式地将域指定为localhost(或.localhost)时。某些浏览器似乎不接受cookie

Firefox 3.5:我在Firebug中检查了HTTP请求。我看到的是:

Set-Cookie:
    name=value;
    domain=localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/
或者(当我将域设置为.localhost时):

在这两种情况下,都不会存储cookie

IE8:我没有使用任何额外的工具,但是cookie似乎也没有被存储,因为它不会在后续请求中被发回

Opera 9.64:localhost和.localhost都可以工作,但是当我在首选项中检查cookie列表时,域被设置为localhost.local,即使它列在localhost下(在列表分组中)

Safari 4:localhost和.localhost都可以工作,但它们在首选项中始终列为.localhost。另一方面,没有显式域的cookie只显示为localhost(无点)

localhost有什么问题?由于存在如此多的不一致性,必须有一些涉及localhost的特殊规则。此外,我还不完全清楚为什么域的前缀必须是点?RFC 2109明确规定:

域属性的值 不包含嵌入点或不包含嵌入点 从一个点开始


为什么??文档表明它必须与安全性相关。我必须承认,我没有阅读整个规范(可能以后再看),但听起来有点奇怪。基于此,在本地主机上设置cookie是不可能的。

根据设计,域名必须至少有两个点;否则浏览器会认为它们是无效的。(见参考资料)

使用
localhost
时,必须完全忽略cookie域。您不应该将其设置为
NULL
FALSE
,而不是
“localhost”
。这还不够

有关PHP,请参阅上的注释


如果使用Java Servlet API,根本不要调用
cookie.setDomain(“…”)
方法。

另一个重要的细节是,expires=应该使用以下日期时间格式:Wdy,DD Mon YYYY HH:MM:SS GMT()


我在使用127.0.0.1作为域进行本地测试时运气要好得多。我不知道为什么,但我在localhost和.localhost等方面的结果是混合的。

我的结果因浏览器而异

Chrome-127.0.0.1运行正常,但localhost.localhost和“”未运行。 Firefox-.localhost工作正常,但localhost、127.0.0.1和“”没有工作


没有在Opera、IE或Safari中测试过,我大体上同意@Ralph Buchfelder的观点,但在我的本地机器(OS X/Apache/Chrome | Firefox)上复制一个带有多个子域(例如example.com、fr.example.com、de.example.com)的系统时,通过实验,这里有一些对这一点的放大

我编辑了/etc/hosts,将一些虚构的子域指向127.0.0.1:

127.0.0.1 localexample.com
127.0.0.1 fr.localexample.com
127.0.0.1 de.localexample.com
如果我使用的是fr.localexample.com,而没有使用domain参数,则会为fr.localexample.com正确存储cookie,但在其他子域中不可见

如果我使用的域为“.localexample.com”,则会为fr.localexample.com正确存储cookie,并且在其他子域中可见

如果我使用“localexample.com”域,或者当我尝试使用“localexample”或“localhost”域时,cookie没有被存储

如果我使用的域是“fr.localexample.com”或“.fr.localexample.com”,则会正确地为fr.localexample.com存储cookie,并且(正确地)在其他子域中不可见

因此,在域中至少需要两个点的要求似乎是正确的,尽管我不明白为什么应该这样

如果有人想尝试一下,下面是一些有用的代码:

<html>
<head>
<title>
Testing cookies
</title>
</head>
<body>
<?php
header('HTTP/1.0 200');
$domain = 'fr.localexample.com';    // Change this to the domain you want to test.
if (!empty($_GET['v'])) {
    $val = $_GET['v'];
    print "Setting cookie to $val<br/>";
    setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain);
}
print "<pre>";
print "Cookie:<br/>";
var_dump($_COOKIE);
print "Server:<br/>";
var_dump($_SERVER);
print "</pre>";
?>
</body>
</html>

测试cookies

本地主机:您可以使用:
域:“.app.localhost”
,它将正常工作。“域”参数需要在域名中设置一个或多个点来设置cookie。然后,您可以让会话跨本地主机子域工作,例如:
api.app.localhost:3000

document.cookie=valuename+“=”+value+”;“+expires+”;domain=;path=/”

这个“域=;路径=/”;将动态域作为其cookie在子域中工作。
如果你想在localhost中进行测试,它会起作用的。建议的修复方法对我来说都不起作用——将其设置为null、false、添加两个点等等——都不起作用

最后,我只是从cookie中删除了这个域,如果它是localhost,并且现在在chrome38中对我有效

以前的代码(不起作用):

新代码(正在运行):

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/

这里没有一个答案对我有用。我将我的PHP作为页面的第一件事来修复它

与其他头一样,cookie必须在脚本输出之前发送(这是协议限制)。这要求您在任何输出(包括和标记以及任何空格)之前对该函数进行调用


可以看出,如果要显式地将域设置为“localhost”,则当cookie设置为显式域“localhost”时,应将其设置为
false
undefined

,如下所示

设置Cookie:name=value; 域=本地主机;expires=周四,2009年7月16日21:25:05格林威治标准时间;路径=/

…然后浏览器会忽略它,因为它

…域中必须至少有两(2)或三(3)个句点才能 阻止以下形式的域:“.com”、“.edu”和“va.us”。任何域 这在列出的七个特殊顶级域中的一个域中失败 下面只需要两个句号。任何其他域至少需要 三个。七个特殊顶级域名是:“COM”、“EDU”、“NET”, “组织”、“政府”、“军事”和“国际”
<html>
<head>
<title>
Testing cookies
</title>
</head>
<body>
<?php
header('HTTP/1.0 200');
$domain = 'fr.localexample.com';    // Change this to the domain you want to test.
if (!empty($_GET['v'])) {
    $val = $_GET['v'];
    print "Setting cookie to $val<br/>";
    setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain);
}
print "<pre>";
print "Cookie:<br/>";
var_dump($_COOKIE);
print "Server:<br/>";
var_dump($_SERVER);
print "</pre>";
?>
</body>
</html>
document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';
 if(document.domain === 'localhost') {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ;
    } else {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';
    }
Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/
Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/
set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly
func addCookie(w http.ResponseWriter, name string, value string) {
    expire := time.Now().AddDate(0, 0, 1)
    cookie := http.Cookie{
       Name:    name,
       Value:   value,
       Expires: expire,
       Domain:  ".localhost",
       Path:    "/",
    }
    http.SetCookie(w, &cookie)
}
Set-Cookie: session_token=74528588-7c48-4546-a3ae-4326e22449e5; Expires=Sun, 16 Aug 2020 04:40:42 GMT; Path=/
document.cookie = `${name}=${value}${expires}; Path=/; Domain=localhost; SameSite=Lax`;