Jan*_*ich 169 cookies setcookie
我一定错过了一些关于cookie的基本知识.在本地主机上,当我设置在服务器端的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=/
Run Code Online (Sandbox Code Playgroud)
或者(当我将域设置为.localhost时):
Set-Cookie:
name=value;
domain=.localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
Run Code Online (Sandbox Code Playgroud)
在任何一种情况下,都不会存储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明确声明:
Domain属性的值不包含嵌入点或不以点开头.
为什么?该文件表明它必须对安全做些什么.我不得不承认我没有阅读整个规范(稍后可能会这样做),但听起来有点奇怪.基于此,在localhost上设置cookie是不可能的.
小智 219
根据设计,域名必须至少有两个点; 否则浏览器会认为它们无效.(参见http://curl.haxx.se/rfc/cookie_spec.html上的参考资料)
在处理时localhost,必须完全省略cookie域.只要将它设置为""或NULL或FALSE代替的"localhost"是不够的.
对于PHP,请参阅http://php.net/manual/en/function.setcookie.php#73107上的注释.
如果使用Java Servlet API,请不要调用该cookie.setDomain("...")方法.
Rob*_*ujo 32
跨站点cookies问题我是这样解决的:
\n服务器端
\n属性:
\nSameSite=None; Secure; Path=/\nRun Code Online (Sandbox Code Playgroud)\n前端(在我的例子中是 Angular)
\n设置 XHR.withCredentials=true:
\nvar xhr = new XMLHttpRequest();\nxhr.open(\'GET\', \'http://localhost:8080/\', true);\nxhr.withCredentials = true;\nxhr.send(null);\nRun Code Online (Sandbox Code Playgroud)\n我的解读:
\n当后端和前端域不同时,浏览器将根据收到的响应决定是否将 cookie 保存在前端域 cookie 存储中。withCredentials=true仅当 XHR 请求具有并且收到正确的服务器 Cookie 属性(HTTP Set-Cookie 标头)时,浏览器才允许发送 Cookie
当后端和前端域不同时,浏览器将决定是否在请求中发送 cookie 。仅当 XHR 请求有时浏览器才会允许此操作withCredentials=true
换句话说,如果withCredentials=true省略 - cookie 不会在请求中发送,也不会从响应中接收和保存
收到的 cookie 始终存储在浏览器 cookie 存储中的前端域名下。如果服务器域不同并且cookie保存成功,则效果与最初由前端域发送的效果相同。
\n如果SameSite=None省略 cookie 属性,今天的浏览器(Firefox/Chrome)将使用默认Lax模式,这对于跨站点 cookie 来说过于严格
如果Securedcookie 属性被省略 - 那么SameSite=None将被忽略 - 它需要Secured设置
对于 localhost Securedcookie 属性浏览器不需要 HTTPS / SSL,http即可工作 - 无需在以下情况下提供前端或后端服务https://localhost ...
编辑 2022-03-02 - 对于 Safari (v15.1),这不是真的 -> 在 Safari http://localhost + 带有 Secure 的 cookie - cookie 将被忽略,不会保存在浏览器中(解决方案:对于 Safari + http: //localhost 删除 Secure 和 SameSite(如果提供)。
\n编辑 2023-01-13 - @Barnaby 报告“Firefox 拒绝设置它:\'已被拒绝,因为非 HTTPS cookie 可以 \xe2\x80\x99t 设置为 \xe2\x80\x9csecure\xe2\x80\ x9d.\'" 如果是这种情况 - Safari 的解决方案应该有效(请参阅上面的编辑 2022-03-02)。
\n诊断提示:
\n参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
\nxgr*_*sch 29
我大致同意@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
Run Code Online (Sandbox Code Playgroud)
如果我正在处理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,并且在其他子域中(正确)不可见.
因此,要求您在域中至少需要两个点似乎是正确的,即使我不明白为什么它应该是.
如果有人想尝试这个,这里有一些有用的代码:
<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>
Run Code Online (Sandbox Code Playgroud)
Amp*_*mpT 27
localhost:你可以使用:domain: ".app.localhost"它会工作.在"域"参数需要1个或多个点的域名设置Cookie.然后,您可以在localhost子域中运行会话,例如:api.app.localhost:3000.
Sco*_*nro 13
当使用显式域"localhost"设置cookie时,如下所示......
Set-Cookie:name = value; domain = localhost ; 到期=周四,2009年7月16日21:25:05 GMT; 路径= /
...然后浏览器忽略它,因为它不包括至少两个句点,并且不是七个特殊处理的顶级域之一.
...域必须至少有两(2)或三(3)个句点,以防止形式的域:".com",".edu"和"va.us".在下面列出的七个特殊顶级域之一中失败的任何域只需要两个句点.任何其他域名至少需要三个.七个特殊的顶级域名是:"COM","EDU","NET","ORG","GOV","MIL"和"INT".
请注意,上述期间数可能假定需要一个领先期.然而,在现代浏览器中忽略了这个时期,它应该可以阅读......
至少一(1)或两(2)个时期
请注意,domain属性的默认值是生成cookie响应的服务器的主机名.
因此,没有为localhost设置cookie的解决方法是简单地不指定域属性并让浏览器使用默认值 - 这似乎没有与domain属性中的显式值相同的约束.
小智 6
使用PHP;此页面上没有任何内容对我有用。我最终在我的代码中意识到PHP 的secure参数始终被设置为.session_set_cookie_params()TRUE
由于我没有localhost使用 HTTPS 进行访问,因此我的浏览器永远不会接受 cookie。因此,我修改了代码的该部分,以secure根据是否$_SERVER['HTTP_HOST']存在有条件地设置参数。localhost现在效果很好。
| 归档时间: |
|
| 查看次数: |
191961 次 |
| 最近记录: |