本地主机上带有显式域名的Cookie

我必须错过一些关于cookies的基本知识。 在本地主机上,当我在服务器端设置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时):

Set-Cookie:
    name=value;
    domain=.localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

无论哪种情况,都不会存储Cookie。

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

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

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

本地主机有什么问题? 由于这样的一些不一致,必须有一些涉及localhost的特殊规则。 另外,我还不完全清楚为什么域名必须以点为前缀? RFC 2109明确规定:

“域”属性的值不包含嵌入的点或不以点开头。

为什么? 该文件表明它必须做一些安全的事情。 我不得不承认,我没有阅读整个规范(稍后可能会这样做),但这听起来有点奇怪。 基于此,在本地主机上设置cookie将是不可能的。


按照设计,域名必须至少有两个点; 否则浏览器会认为它们无效。 (请参阅http://curl.haxx.se/rfc/cookie_spec.html上的参考资料)

localhost工作时,cookie域必须完全省略。 只需将其设置为""NULLFALSE而不是"localhost"是不够的。

对于PHP,请参阅http://php.net/manual/en/function.setcookie.php#73107上的评论。

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


我大致赞同@Ralph Buchfelder,但这里有一些放大,试图在我的本地机器上复制包含多个子域(如example.com,fr.example.com,de.example.com)的系统时OS X / Apache / Chrome | Firefox)。

我编辑了/ 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参数,则cookie正确存储在fr.localexample.com中,但在其他子域中不可见。

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

如果我使用的是“localexample.com”的域名,或者当我尝试一个“localexample”或“localhost”的域名,则Cookie不会被存储。

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

因此,在域中至少需要两个点的要求看起来是正确的,尽管我不明白为什么它应该是。

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

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

localhost:你可以使用: domain: ".app.localhost" ,它会工作。 'domain'参数在域名中需要一个或多个点来设置cookie。 然后,您可以使用跨本地主机子域的会话进行工作,例如: api.app.localhost:3000

链接地址: http://www.djcxy.com/p/44887.html

上一篇: Cookies on localhost with explicit domain

下一篇: Why does Chrome ignore local jQuery cookies?