我一定是忽略了饼干的一些基本特性。在localhost上,当我在服务器端设置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都可以工作,但它们总是在首选项中列出为.localhost。另一方面,一个没有显式域的cookie,它只显示为localhost(没有点)。
localhost有什么问题?由于存在如此多的不一致,必须有一些涉及localhost的特殊规则。另外,我也不完全清楚为什么域名必须以一个点作为前缀?RFC 2109明确指出:
Domain属性的值
不包含或不包含嵌入点
从一个点开始。
为什么?该文档表明它必须在安全性方面做一些事情。我必须承认我没有阅读完整的规范(可能以后会读),但它听起来有点奇怪。基于此,在本地主机上设置cookie是不可能的。
当cookie设置为显式域'localhost'时,如下所示…
set - cookie: name =价值;
域=主机;到期=周四,16- july 2009 21:25:05 GMT;路径= /
...然后浏览器会忽略它,因为它不包括至少两个句点,也不是七个专门处理的顶级域之一。
...域必须至少有两(2)或三(3)个句点
防止域名形式为“。com”,“。edu”和“va.us”。任何领域
在列出的七个特殊顶级域之一中失败
下面只需要两个周期。任何其他域至少需要
三。七个特殊的顶级域名是:"COM", "EDU", "NET",
"ORG", "GOV", "MIL", "INT"。
请注意,上面的周期数可能假设需要一个前导周期。然而,在现代浏览器中,这个句点被忽略了,它应该读作…
至少一(1)或两(2)个句点
请注意,domain属性的默认值是生成cookie响应的服务器的主机名。
因此,对于没有为localhost设置cookie的解决方法是简单地不指定域属性,并让浏览器使用默认值-这似乎没有域属性中的显式值所具有的相同约束。
当cookie设置为显式域'localhost'时,如下所示…
set - cookie: name =价值;
域=主机;到期=周四,16- july 2009 21:25:05 GMT;路径= /
...然后浏览器会忽略它,因为它不包括至少两个句点,也不是七个专门处理的顶级域之一。
...域必须至少有两(2)或三(3)个句点
防止域名形式为“。com”,“。edu”和“va.us”。任何领域
在列出的七个特殊顶级域之一中失败
下面只需要两个周期。任何其他域至少需要
三。七个特殊的顶级域名是:"COM", "EDU", "NET",
"ORG", "GOV", "MIL", "INT"。
请注意,上面的周期数可能假设需要一个前导周期。然而,在现代浏览器中,这个句点被忽略了,它应该读作…
至少一(1)或两(2)个句点
请注意,domain属性的默认值是生成cookie响应的服务器的主机名。
因此,对于没有为localhost设置cookie的解决方法是简单地不指定域属性,并让浏览器使用默认值-这似乎没有域属性中的显式值所具有的相同约束。