题
我一定是错过了一些关于 cookie 的基本知识。在本地主机上,当我在服务器端设置 cookie 时 和 将域显式指定为 localhost(或 .localhost)。某些浏览器似乎不接受cookie。
火狐 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 似乎也没有被存储,因为它没有在后续请求中被发送回。
歌剧 9.64: localhost 和 .localhost 工作, ,但是当我检查首选项中的 cookie 列表时,域被设置为 localhost.local,即使它列在 localhost 下(在列表分组中)。
狩猎4: localhost 和 .localhost 工作, ,但它们始终在首选项中列为 .localhost。另一方面,没有显式域的 cookie,它仅显示为 localhost(无点)。
本地主机有什么问题?由于存在如此多的不一致之处,必须有一些涉及 localhost 的特殊规则。另外,我不太清楚为什么域名必须以点为前缀?RFC 2109 明确指出:
域属性的值不包含嵌入的点或不以点开头。
为什么?该文件表明它必须采取一些与安全有关的措施。我不得不承认我还没有阅读整个规范(可能稍后会读),但这听起来有点奇怪。基于此,在本地主机上设置 cookie 是不可能的。
解决方案
,域名必须至少有两个点;否则浏览器会考虑他们无效。 (参见 http://curl.haxx.se/rfc/cookie_spec.html 参考)
上localhost
工作时,该cookie域必须被完全省略。只是将它设置为""
或NULL
或FALSE
代替"localhost"
是不够的。
有关PHP,见 http://php.net/manual/评论烯/ function.setcookie.php#73107 。
如果使用Java Servlet API的工作,不叫cookie.setDomain("...")
方法都没有。
其他提示
我大致与@Ralph Buchfelder同意,但这里有一些这方面的放大,通过实验试图复制上与几个子域的系统(如example.com,fr.example.com,de.example.com)当我的本地机器(OS X /阿帕奇/铬|火狐)。
我已经编辑的/ etc /主机在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和我离开域参数时,cookie将被正确地储存fr.localexample.com,而不是在其他子域可见。
如果我使用的 “.localexample.com” 域,该cookie被正确地存储用于fr.localexample.com,和是在其它子畴中可见。
如果我使用的“localexample.com”,或当我试图只是“localexample”或“本地主机”的域,该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>
本地主机::您可以使用:domain: ".app.localhost"
,它会工作。在“域”参数需要1点或更多的点强>在域名用于设置的cookie。然后你就可以拥有如会话跨本地主机子站点:api.app.localhost:3000
当一个cookie被设定为的“本地主机”的明确域如下...
设置Cookie:名称=值; 的域=本地主机强>;期满=星期四,16-JUL-2009 21时25分05秒GMT;路径= /
...然后浏览器忽略它,因为它不包括至少两个周期,而不是一个七个特殊处理,顶级域名的。
...域必须具有至少两个(2)或它们的三(3)周期来 防止形式的结构域:“.COM”,“埃杜”和‘va.us’。任何领域 中列出的七个特殊的顶级域名之一失败 下面只需要两个时期。任何其他域至少需要 三。七个特殊的顶级域名分别是:“COM”,“EDU”,“NET”, “ORG”, “GOV”, “MIL”,和 “INT”。
请注意,上面大概周期的数量假定一个超前时段是必需的。这一时期然而忽视了现代浏览器和它也许应该读...
至少的一(1)或两个(2)强>周期
请注意,对于域属性的缺省值是产生cookie的服务器的主机名响应。
所以饼干未设置为本地主机的解决方法是根本就没有指定域属性并让浏览器使用默认值 - 这似乎并不具有相同的约束,一个明确的价值在域属性一样。
结果我已经通过浏览器改变。
CHROME- 127.0.0.1的工作,但本地主机.localhost和 “” 没有。 Firefox- .localhost的工作,但本地主机,127.0.0.1和 “” 没有。
还没有在Opera测试,IE或Safari
花了大量时间解决此问题我自己。
使用PHP,这个页面上没有为我工作。我终于实现了我的代码中的“安全”参数 PHP的session_set_cookie_params()总是被设置为TRUE。
由于我没有以https访问本地主机我的浏览器就不会接受Cookie。所以,我修改我的代码,部分有条件地设置基于$ _ SERVER的“安全” PARAM [“HTTP_HOST”]被“localhost”的与否。工作良好现在
我希望这可以帮助别人。
我不得不使用127.0.0.1作为域名更好的运气测试本地。我不知道为什么,但我已经混有本地主机和.localhost等结果。
建议的修复程序都不为我工作 - 将其设置为空,假,增加了两个点,等等 - 没有工作。
在最后,我只是删除Cookie中的域名如果是本地主机,并且现在对我的作品的 Chrome 38版
前面的代码(没有工作):
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=/;';
}
我有同样的问题,我通过将在cookie的名称本身2个点不指定任何域固定它。
set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly
使用的时候好像有问题 https://<local-domain>
进而 http://<local-domain>
. 。这 http://
网站不会在之后发送带有请求的 cookie https://
网站设置它们。强制重新加载和清除缓存没有帮助。只能手动清除 cookie。另外,如果我清除它们 https://
页,那么 http://
页面再次开始工作。
看起来与“严格安全cookie”有关。很好的解释 这里. 。它是 Chrome 58 中发布 于 2017 年 4 月 19 日。
看起来 Chrome 实际上确实记录了安全 cookie 和非安全 cookie,因为当单击地址栏图标时,它会根据页面的协议显示正确的 cookie。
但 Developer tools > Application > Cookies
当同一域存在同名的安全 cookie 时,不会显示非安全 cookie,也不会随任何请求发送非安全 cookie。这似乎是一个 Chrome 错误,或者如果这种行为是预期的,那么应该有某种方法可以在使用 http
页面并指示它们正在被覆盖。
解决方法是根据它们是用于 http 站点还是 https 站点,使用不同的命名 cookie,并根据您的应用程序对它们进行命名。A __Secure-
前缀表示 cookie 应该是严格安全的,这也是一个很好的做法,因为安全和非安全不会发生冲突。有 其他福利 也到前缀。
使用不同的 /etc/hosts
https 与 https 的域名http访问也可以,但是一个意外 https://localhost
访问将阻止任何同名 cookie 运行 http://localhost
网站 - 所以这不是一个好的解决方法。
我已经提交了一份 Chrome 错误报告.
您可以使用localhost.org
的或者说.localhost.org
将始终解析为127.0.0.1
的document.cookie = VALUENAME + “=” +值+ “;” +期满+ “;域=;路径= /”;
此 “域=;路径= /”;将采取动态域名作为cookie将在子域工作。 如果u想在本地主机来测试它的工作
在这里为我工作的答案都不对。我通过把我的PHP作为非常非常第一件事就是页面固定它。
像其他头,cookie必须从脚本任何输出(这是一个协议限制)之前发送。这就需要你之前的任何输出将调用该函数,包括和标签以及任何空格。的
有是铬的问题,因为2011 开放, ,如果正在显式设置域为“本地主机”,则应该将其设置为false
或undefined
。
我正在玩周围有点。
Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/
在Firefox和Chrome的工作从今天开始。但是,我没有找到一种方法,使其与卷曲工作。我试图主机标头和--resolve,没有运气,理解的任何帮助。
然而,它工作在卷曲,如果将它设置为
Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/
代替。 (其不与Firefox工作。)
另一个重要的细节, 过期= 应使用以下日期时间格式: 周日、日-周一-年 HH:MM:SS GMT (RFC6265 - 第 4.1.1 节).
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-07-2019 21:25:05 GMT;
path=/
如果你从另一个域设置cookie(即你通过做一个XHR跨源请求设置cookie),那么你需要确保你的withCredentials
属性设置为对XMLHttpRequest的真实使用来获取饼干如所描述的这里