Cookies on localhost with explicit domain
我一定错过了一些关于cookie的基本知识。在localhost上,当我在服务器端设置cookie并将域明确指定为localhost(或.localhost)时。某些浏览器似乎没有接受cookie。
Firefox 3.5:我在Firebug中检查了HTTP请求。我看到的是:
1 2 3 4 5 | Set-Cookie: name=value; domain=localhost; expires=Thu, 16-Jul-2009 21:25:05 GMT; path=/ |
或者(当我将域设置为.localhost时):
1 2 3 4 5 | Set-Cookie: name=value; domain=.localhost; expires=Thu, 16-Jul-2009 21:25:05 GMT; path=/ |
在任何一种情况下,都不会存储cookie。
IE8:我没有使用任何额外的工具,但cookie似乎也没有存储,因为它不会在后续请求中发回。
Opera 9.64:localhost和.localhost都工作,但是当我检查Preferences中的cookie列表时,域名设置为localhost.local,即使它列在localhost下(在列表分组中)。
Safari 4:localhost和.localhost都可以工作,但它们在Preferences中始终列为.localhost。另一方面,没有显式域的cookie,它显示为localhost(无点)。
localhost有什么问题?由于存在这么多的不一致,必须有一些涉及localhost的特殊规则。另外,我不完全清楚为什么域名必须以点为前缀? RFC 2109明确声明:
The value for the Domain attribute
contains no embedded dots or does not
start with a dot.
为什么?该文件表明它必须对安全做些什么。我不得不承认我没有阅读整个规范(稍后可能会这样做),但听起来有点奇怪。基于此,在localhost上设置cookie是不可能的。
根据设计,域名必须至少有两个点;否则浏览器会认为它们无效。 (参见http://curl.haxx.se/rfc/cookie_spec.html上的参考资料)
处理
对于PHP,请参阅http://php.net/manual/en/function.setcookie.php#73107上的注释。
如果使用Java Servlet API,则根本不要调用
我大致同意@Ralph Buchfelder,但是在我的本地机器上尝试复制具有多个子域(例如example.com,fr.example.com,de.example.com)的系统时,通过实验进行了一些扩展。 OS X / Apache / Chrome | Firefox)。
我已经编辑/ etc / hosts指向一些想象中的子域名为127.0.0.1:
1 2 3 | 127.0.0.1 localexample.com 127.0.0.1 fr.localexample.com 127.0.0.1 de.localexample.com |
如果我正在处理fr.localexample.com并且我将domain参数保留为out,则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,并且在其他子域中(正确)不可见。
因此,要求您在域中至少需要两个点似乎是正确的,即使我不明白为什么它应该是。
如果有人想尝试这个,这里有一些有用的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <html> <head> Testing cookies </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"[cc]"; print"Cookie:<br/>"; var_dump($_COOKIE); print"Server:<br/>"; var_dump($_SERVER); print" |
";
?>
BODY>
HTML>
代码> PRE>
localhost:你可以使用:
当使用显式域"localhost"设置cookie时,如下所示......
Set-Cookie: name=value;
domain=localhost; expires=Thu, 16-Jul-2009 21:25:05 GMT; path=/
...然后浏览器忽略它,因为它不包括至少两个句点,并且不是七个特殊处理的顶级域之一。
...domains must have at least two (2) or three (3) periods in them to
prevent domains of the form:".com",".edu", and"va.us". Any domain
that fails within one of the seven special top level domains listed
below only require two periods. Any other domain requires at least
three. The seven special top level domains are:"COM","EDU","NET",
"ORG","GOV","MIL", and"INT".
请注意,上述期间数可能假定需要一个领先期。然而,在现代浏览器中忽略了这个时期,它应该可以阅读......
at least one (1) or two (2) periods
请注意,domain属性的默认值是生成cookie响应的服务器的主机名。
因此,没有为localhost设置cookie的解决方法是简单地不指定域属性并让浏览器使用默认值 - 这似乎没有与domain属性中的显式值相同的约束。
花了很多时间自己解决这个问题。
使用PHP,此页面上的Nothing对我有用。我最终在我的代码中意识到PHP的session_set_cookie_params()的'secure'参数始终设置为TRUE。
由于我没有使用https访问localhost,我的浏览器永远不会接受cookie。所以,我修改了我的代码部分,以有条件地设置基于$ _SERVER ['HTTP_HOST']为'localhost'的'secure'参数。现在运作良好。
我希望这可以帮助别人。
结果我的浏览器各不相同。
Chrome-127.0.0.1工作但localhost .localhost和"没有。
Firefox- .localhost工作但localhost,127.0.0.1,"没有。
尚未在Opera,IE或Safari中测试过
没有任何建议的修复程序对我有用 - 将其设置为null,false,添加两个点等 - 不起作用。
最后,我刚刚从cookie中移除了域名,如果它是localhost,那么现在可以在Chrome 38中使用。
以前的代码(不起作用):
1 | document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;'; |
新代码(现在正在运行):
1 2 3 4 5 | if(document.domain === 'localhost') { document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ; } else { document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;'; } |
使用
看起来与"严格的安全cookie"有关。这里有好的解释。它在2017-04-19的Chrome 58中发布。
事实上,Chrome确实记录了安全Cookie和非安全Cookie,因为在点击地址栏图标时,它会根据页面的协议显示正确的Cookie。
但是,当同一域名存在同名安全cookie时,
解决方法是使用不同的命名cookie,具体取决于它们是用于http站点还是https站点,并将其命名为特定于您的应用程序。
使用不同的
我已经提交了Chrome错误报告。
我有同样的问题,我通过在cookie名称中放置2个点而不指定任何域来修复它。
1 | set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly |
我使用127.0.0.1作为域在本地测试运气好得多。我不知道为什么,但我的localhost和.localhost等结果好坏参半。
您可以使用
另一个重要细节,expires =应使用以下日期时间格式:Wdy,DD-Mon-YYYY HH:MM:SS GMT(RFC6265 - 第4.1.1节)。
1 2 3 4 5 | Set-Cookie: name=value; domain=localhost; expires=Thu, 16-07-2019 21:25:05 GMT; path=/ |
document.cookie = valuename +"="+ value +";"+ expires +"; domain =; path = /";
这个"domain =; path = /";将采用动态域,因为它的cookie将在子域中工作。
如果你想在localhost中测试它会工作
自2011年以来,Chromium上存在一个问题,如果您明确将域设置为"localhost",则应将其设置为
我玩的有点儿。
1 | Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/ |
适用于今天的Firefox和Chrome。但是,我没有找到一种方法让它与卷曲一起使用。我尝试了Host-Header和--resolve,没有运气,任何帮助表示赞赏。
但是,如果我将它设置为curl,它可以工作
1 | Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/ |
代替。 (这不适用于Firefox。)
如果您正在从另一个域设置cookie(即您通过发出XHR交叉源请求来设置cookie),那么您需要确保在用于获取cookie的XMLHttpRequest上将
这里没有任何答案对我有用。我通过将PHP作为页面中的第一件事来修复它。
与其他标头一样,必须在脚本的任何输出之前发送cookie(这是协议限制)。这要求您在任何输出之前调用此函数,包括和标记以及任何空格。
来自http://php.net/manual/en/function.setcookie.php