因为我遇到的奇怪的域/子域Cookie问题,我想知道浏览器如何处理Cookie。 若是他们以不一样的方式来作,那么了解它们之间的差别也将是一件很高兴的事情。 javascript
换句话说-当浏览器收到一个cookie时,该cookie可能有一个域和一个附加的路径。 是否能够,在这种状况下,浏览器可能会用一些默认值替代它们。 问题1:它们是什么? html
稍后,当浏览器即将发出请求时,它会检查其cookie并过滤掉应为该请求发送的cookie。 它经过将它们与请求路径和域进行匹配来实现。 问题2:有哪些匹配规则? java
我问这个的缘由是由于我对一些极端状况感兴趣。 喜欢: web
.example.com
的cookie是否可用于www.example.com
? .example.com
的cookie是否可用于example.com
? www.example.com
是否可使用example.com
的cookie? example.com
的cookie是否可用于anotherexample.com
? www.example.com
能够为example.com
设置cookie吗? www.example.com
可以为www2.example.com
设置cookie吗? www.example.com
可以为.com
设置cookie吗? 新增2: 浏览器
另外,有人能够建议我应该如何设置Cookie,以便: 服务器
www.example.com
或example.com
进行设置; www.example.com
和example.com
访问。 有关普遍的内容,请查阅RFC2965的内容。 固然,这并不必定意味着全部浏览器的行为都彻底相同。 cookie
可是,一般,默认路径(若是cookie中未指定)的默认规则是Set-Cookie标头从其到达的URL中的路径。 一样,域的默认值是Set-Cookie到达的URL中的完整主机名。 app
域的匹配规则要求Cookie域与要向其发出请求的主机匹配。 Cookie能够经过包含*指定更普遍的域匹配。 在Set-Cookie的domain属性中(浏览器的这一区域可能有所不一样)。 匹配路径(假设域匹配)很简单,请求的路径必须在cookie上指定的路径内。 一般,会话cookie是使用path = /或path = / applicationName /设置的,所以cookie可供应用程序中的全部请求使用。 dom
*
我如今没法对此进行测试,但我暗示至少IE7 / 6会将路径example.com
视为.example.com
。 测试
尽管如今有应该定义cookie的RFC 2965 ( Set-Cookie2
,已通过时的RFC 2109 ),可是大多数浏览器并不彻底支持cookie,而是仅符合Netscape的原始规范 。
域属性值和有效域之间是有区别的:前者来自Set-Cookie
标头字段,后者是对该属性值的解释。 根据RFC 2965,如下内容应适用:
.
开头,则它将由客户端添加)。 拥有有效域后,它还必须与当前请求的域进行域匹配以进行设置; 不然,cookie将被修改。 相同的规则适用于选择要在请求中发送的cookie。
将这些知识映射到您的问题上,应遵循如下条件:
Domain=.example.com
将可用于www.example.com Domain=.example.com
将可用于example.com Domain=example.com
将被转换为.example.com
而且所以也将可用于www.example.com Domain=example.com
Cookie 不适用于anotherexample.com 并设置和读取www.example.com和example.com的cookie,分别将其设置为.www.example.com
和.example.com
。 可是第一个( .www.example.com
)仅可用于该域下的其余域(例如foo.www.example.com或bar.www.example.com ),在该域中,任何用户均可以访问.example.com
example.com下面的其余域(例如foo.example.com或bar.example.com )。
有一些规则肯定浏览器是否接受Set-header响应头(服务器端cookie编写),使用Javascript设置cookie的规则/解释略有不一样(我还没有测试VBScript)。
而后是肯定浏览器是否将与页面请求一块儿发送cookie的规则。
主要浏览器引擎之间的区别在于如何处理域匹配以及如何解释路径值中的参数。 您能够在文章“不一样的浏览器如何不一样地处理Cookie”中找到一些经验证据。
此问题的最后一个(确切地说是第三个)RFC是RFC-6265(已淘汰RFC-2965,然后者又淘汰了RFC-2109)。
根据它,若是服务器省略了Domain属性,则用户代理将cookie仅返回到原始服务器 (给定资源所在的服务器)。 但这同时也警告某些现有用户代理将缺乏的Domain属性视为存在Domain属性并包含当前主机名(例如,若是example.com返回不具备Domain属性的Set-Cookie标头,则这些用户代理会也会将Cookie错误地发送到www.example.com)。
指定Domain属性后,它将被视为完整的域名(若是属性中有前导点,它将被忽略)。 服务器应匹配属性中指定的域(具备彻底相同的域名或做为其子域)以获取此cookie。 更准确地说是在这里指定的 。
所以,例如:
Domain=.example.com
等效于Domain=example.com
Domain=www.example.com
将关闭www4.example.com的方式 PS:“域”属性中的尾部逗号将致使用户代理忽略该属性=(
www.example.com
可以为.com
设置cookie吗?
否,可是example.com.fr
可能能够为example2.com.fr
设置cookie。 Firefox经过维护TLD列表来防止这种状况: http : //securitylabs.websense.com/content/Blogs/3108.aspx
显然Internet Explorer不容许两个字母的域设置cookie,我想这解释了为何o2.ie
只是重定向到o2online.ie
。 我常常想知道。