我一定错过了一些关于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=/
或者(当我将域设置为.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都工作,但是当我检查Preferences中的cookie列表时,域名设置为localhost.local,即使它列在localhost下(在列表分组中).
Safari 4: localhost和.localhost都可以工作,但它们在Preferences中始终列为.localhost.另一方面,没有显式域的cookie,它显示为localhost(无点).
localhost有什么问题?由于存在这么多的不一致,必须有一些涉及localhost的特殊规则.另外,我不完全清楚为什么域名必须以点为前缀?RFC 2109明确声明:
Domain属性的值不包含嵌入点或不以点开头.
为什么?该文件表明它必须对安全做些什么.我不得不承认我没有阅读整个规范(稍后可能会这样做),但听起来有点奇怪.基于此,在localhost上设置cookie是不可能的.
根据设计,域名必须至少有两个点; 否则浏览器会认为它们无效.(参见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("...")
方法.
我大致同意@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参数保留为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,并且在其他子域中(正确)不可见.
因此,要求您在域中至少需要两个点似乎是正确的,即使我不明白为什么它应该是.
如果有人想尝试这个,这里有一些有用的代码:
Testing cookies "; setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain); } print ""; print "Cookie:"; ?>
"; var_dump($_COOKIE); print "Server:
"; var_dump($_SERVER); print "
localhost:你可以使用:domain: ".app.localhost"
它会工作.在"域"参数需要1个或多个点的域名设置Cookie.然后,您可以在localhost子域中运行会话,例如:api.app.localhost:3000
.
当使用显式域"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属性中的显式值相同的约束.