我现在搜索了很多内容并找到了相互矛盾的答案。所以我的问题是:浏览器如何处理没有domain
且没有path
属性的HTTP cookie?
例如来自服务器的响应:
200 OK https://example.com/a/b (6047ms)
Set-Cookie: x-my-cookie=1.0; Max-Age=86400000; Expires=Sun, 05-Jan-2020 08:30:25 GMT
在向https://m.example.com/a/b
提出请求时是否应包含Cookie?
https://example.com/zzzz
怎么样?
https://example.com/a
?
https://example.com/a/b/c
?
https://example.com
?
答案 0 :(得分:6)
对于没有Set-Cookie
属性的domain
,Cookie的域值为“原始服务器”。根据{{3}}:
除非cookie的属性另有说明,否则cookie是 仅返回到原始服务器(而不是,例如,返回到任何服务器) subdomains)...如果服务器省略了Domain属性,则该用户 代理将仅将cookie返回到源服务器。
有以下例外:
警告:某些现有用户代理会将缺少的Domain属性视为Domain属性存在且包含当前主机名。例如,如果example.com返回没有Domain属性的Set-Cookie标头,则这些用户代理也会错误地将cookie发送到www.example.com。
也许这就是你找到相互矛盾的答案的原因。
对于没有Set-Cookie
属性的path
,RFC6265说明:
如果服务器省略了Path属性,则用户代理将使用request-uri的路径组件的“目录”作为默认值。
对于您的示例,答案是:
在向RFC6265提出请求时是否应包含Cookie?
没有。因为m.example.com
不是原始服务器(example.com
)。
没有。因为/zzz
不在“目录”/a/b
下。
没有。因为/a
不在“目录”/a/b
下。
是。因为/a/b/c
位于“目录”/a/b
下。
没有。因为/
不在“目录”/a/b
下。
答案 1 :(得分:2)
对于一种情况,接受的答案是错误的:
不。因为
/a
不在“目录”/a/b
下。
如果您只关心Internet Explorer,那是真的。如果您在乎标准和符合该标准的浏览器,那就不用了。
RFC 6265提供以下algorithm,用于计算不存在Path
属性时要使用的默认cookie路径:
用户代理必须使用与以下等效的算法 用于计算Cookie的默认路径的算法:
如果这样的话,让uri-path成为request-uri的路径部分 部分存在(否则为空)。例如,如果 request-uri仅包含一个路径(和可选的查询字符串), 那么uri-path是该路径(不带%x3F(“?”)字符) 或查询字符串),以及request-uri是否包含完整的 absoluteURI,uri-path是该URI的路径组成部分。
如果uri路径为空或uri-的第一个字符 路径不是%x2F(“ /”)字符,输出%x2F(“ /”)并跳过 其余步骤。
如果uri路径包含不超过一个%x2F(“ /”)字符, 输出%x2F(“ /”)并跳过其余步骤。
从第一个字符开始输出uri-path的字符 ,但不包括最右边的%x2F(“/")。
我强调了#4,因为这是很重要的部分。对于在uri路径/a/b
处设置的cookie,“最右边的” /
是b
之前的一个。该算法说要在此停止,因此默认cookie路径为/a
,因此cookie 应该发送到https://example.com/a
。
但是,正如大多数Web开发人员所知,“应该”是一回事,而“确实”是另一回事。因此,我写了一个小型的Web应用程序来测试这种确切的情况:将没有设置为/a/b
的显式Path属性的cookie发送到对/a
的请求中吗?调查结果(最新的浏览器版本,Windows 10):
Chrome-是
Firefox-是
边缘-是
Internet Explorer-否