浏览器cookie域如何工做?

因为我遇到的奇怪的域/子域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.comexample.com进行设置;
  • 能够经过www.example.comexample.com访问。

#1楼

有关普遍的内容,请查阅RFC2965的内容。 固然,这并不必定意味着全部浏览器的行为都彻底相同。 cookie

可是,一般,默认路径(若是cookie中未指定)的默认规则是Set-Cookie标头从其到达的URL中的路径。 一样,域的默认值是Set-Cookie到达的URL中的完整主机名。 app

域的匹配规则要求Cookie域与要向其发出请求的主机匹配。 Cookie能够经过包含*指定更普遍的域匹配。 在Set-Cookie的domain属性中(浏览器的这一区域可能有所不一样)。 匹配路径(假设域匹配)很简单,请求的路径必须在cookie上指定的路径内。 一般,会话cookie是使用path = /或path = / applicationName /设置的,所以cookie可供应用程序中的全部请求使用。 dom


回复:

  • .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吗? (经过.example.com除外)
  • www.example.com能够为.com设置cookie吗? (没法在名称空间的上方设置cookie,也不能为.co.uk之类的设置cookie)

*我如今没法对此进行测试,但我暗示至少IE7 / 6会将路径example.com视为.example.com测试


#2楼

尽管如今有应该定义cookie的RFC 2965Set-Cookie2 ,已通过时的RFC 2109 ),可是大多数浏览器并不彻底支持cookie,而是仅符合Netscape原始规范

属性值和有效域之间是有区别的:前者来自Set-Cookie标头字段,后者是对该属性值的解释。 根据RFC 2965,如下内容应适用:

  • 若是Set-Cookie标头字段具备Domain属性,则有效域是请求的域。
  • 若是存在Domain属性,则其值将用做有效域(若是该值不以.开头,则它将由客户端添加)。

拥有有效域后,它还必须当前请求的域进行域匹配以进行设置; 不然,cookie将被修改。 相同的规则适用于选择要在请求中发送的cookie。


将这些知识映射到您的问题上,应遵循如下条件:

  • 饼干与Domain=.example.com 可用于www.example.com
  • 饼干与Domain=.example.com 可用于example.com
  • Cookie与Domain=example.com将被转换为.example.com而且所以也可用于www.example.com
  • 具备Domain=example.com Cookie 不适用于anotherexample.com
  • www.example.com 可以为example.com设置cookie
  • www.example.com没法www2.example.com设置cookie
  • www.example.com没法.com设置Cookie

并设置和读取www.example.comexample.com的cookie,分别将其设置为.www.example.com.example.com 。 可是第一个( .www.example.com )仅可用于该域下的其余域(例如foo.www.example.combar.www.example.com ),在该域中,任何用户均可以访问.example.com example.com下面的其余域(例如foo.example.combar.example.com )。


#3楼

有一些规则肯定浏览器是否接受Set-header响应头(服务器端cookie编写),使用Javascript设置cookie的规则/解释略有不一样(我还没有测试VBScript)。

而后是肯定浏览器是否将与页面请求一块儿发送cookie的规则。

主要浏览器引擎之间的区别在于如何处理域匹配以及如何解释路径值中的参数。 您能够在文章“不一样的浏览器如何不一样地处理Cookie”中找到一些经验证据。


#4楼

此问题的最后一个(确切地说是第三个)RFC是RFC-6265(已淘汰RFC-2965,然后者又淘汰了RFC-2109)。

根据它,若是服务器省略了Domain属性,则用户代理将cookie仅返回到原始服务器 (给定资源所在的服务器)。 但这同时也警告某些现有用户代理将缺乏的Domain属性视为存在Domain属性并包含当前主机名(例如,若是example.com返回不具备Domain属性的Set-Cookie标头,则这些用户代理会也会将Cookie错误地发送到www.example.com)。

指定Domain属性后,它将被视为完整的域名(若是属性中有前导点,它将被忽略)。 服务器应匹配属性中指定的域(具备彻底相同的域名或做为其子域)以获取此cookie。 更准确地说是在这里指定的

所以,例如:

  • Cookie属性Domain=.example.com等效于Domain=example.com
  • 具备此类Domain属性的Cookie将用于example.comwww.example.com
  • 具备此类Domain属性的Cookie 不适用于another-example.com
  • 指定Cookie属性(例如Domain=www.example.com将关闭www4.example.com的方式

PS:“域”属性中的尾部逗号将致使用户代理忽略该属性=(


#5楼

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 。 我常常想知道。

相关文章
相关标签/搜索