我现在在Google上搜索了很多,找到了矛盾的答案。所以我的问题是:浏览器如何处理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
Run Code Online (Sandbox Code Playgroud)
向发出请求时是否应包含cookie https://m.example.com/a/b?
那https://example.com/zzzz呢
还有https://example.com/a呢
还有https://example.com/a/b/c呢
还有https://example.com呢
对于Set-Cookie没有domain属性,cookie的域值为“原始服务器”。根据RFC6265:
除非cookie的属性另有说明,否则cookie仅返回到原始服务器(而不返回到任何子域)...如果服务器省略Domain属性,则用户代理将cookie仅返回到原始服务器。
除了以下例外:
警告:一些现有的用户代理将缺少的“域”属性视为存在“域”属性并包含当前主机名。例如,如果example.com返回不带Domain属性的Set-Cookie标头,则这些用户代理也会错误地将cookie发送到www.example.com。
也许这就是为什么您发现矛盾的答案。
对于Set-Cookie无path属性,RFC6265声明:
如果服务器省略Path属性,则用户代理将使用request-uri的路径组件的“目录”作为默认值。
对于您的示例,答案将是:
向https://m.example.com/a/b发出请求时是否应包含cookie ?
否。因为m.example.com不是源服务器(example.com)。
否。因为/zzz不在“目录”下/a/b。
否。因为/a不在“目录”下/a/b。
是。因为/a/b/cIS在“目录”下/a/b。
否。因为/不在“目录”下/a/b。
对于一种情况,接受的答案是不正确的:
不,因为
/a不在“目录”下/a/b。
如果您只关心 Internet Explorer,那就对了。如果您关心标准和遵守该标准的浏览器,那么事实并非如此。
RFC 6265 提供了以下算法Path来计算属性不存在时要使用的默认 cookie 路径:
用户代理必须使用与以下算法等效的算法来计算 cookie 的默认路径:
如果存在请求 uri 的路径部分(否则为空),则将 uri-path 设为请求 uri 的路径部分。例如,如果 request-uri 仅包含路径(和可选的查询字符串),则 uri-path 就是该路径(不带 %x3F(“?”)字符或查询字符串),并且如果 request-uri 包含完整的绝对 URI,uri-path 是该 URI 的路径组成部分。
如果 uri-path 为空或者 uri-path 的第一个字符不是 %x2F(“/”)字符,则输出 %x2F(“/”)并跳过其余步骤。
如果 uri-path 包含不超过 1 个 %x2F ("/") 字符,则输出 %x2F ("/") 并跳过剩余步骤。
输出 uri 路径中从第一个字符到(但不包括)最右边的 %x2F(“/”)的字符。
我强调了#4,因为这是重要的部分。对于在 uri-path 设置的 cookie /a/b,“最右侧”/是 之前的 cookie b。该算法表示在此停止,因此默认 cookie 路径为/a,因此 cookie应发送到https://example.com/a。
但正如大多数 Web 开发人员所知,“应该”是一回事,“做”是另一回事。因此,我编写了一个小型 Web 应用程序来测试这个确切的场景:未设置显式 Path 属性的 cookie 是否会/a/b在请求中发送到/a?这是我的发现(最新浏览器版本,Windows 10):
铬 - 是的
火狐浏览器 - 是的
边缘 - 是
Internet Explorer - 否
| 归档时间: |
|
| 查看次数: |
3577 次 |
| 最近记录: |