最近在写一个新的项目,采用的依然是传统的html+javascript+css+php的方案
只不过从最开始就完成了前后端分离的抽象,前后端各干各的活
因为我js确实不太擅长,所以这次也算是个学习的过程,能在前端干完的就不让后端去干,索性大部分请求直接ajax+jq库去搞定
然后就遇到了这么个问题,ajax提交完毕登录请求后php执行setcookie,结果前端document.cookie一直看不到
我是分割线
大致情况:
- 同个域名,甚至是同个子域名
- ajax提交Post
- 抓包能看到正常响应了set-cookie
- 前端document.cookie无变化
因为前面方向歪了,网上搜不出来答案,去找GPT4问了一下,好几轮对话下来,gpt4也认为代码没有明显的问题
不过后面在往回反对话历史的时候发现提到了cookie路径这个东西
嗯?cookie路径?cookie还有路径这玩意?
后面直接控制台对着发出的登录请求,在新标签页打开
post请求变成了普通的无参数get请求肯定显示不正常,但不妨碍路径是对的
直接console执行document.cookie
这次终于看到了设置的cookie
我是分割线
那么问题找到了,就是cookie路径的锅
也只能说自己对cookie认识的不到位,之前一直觉得cookie这玩意同个域名就是通的,除非跨域才会出现这种问题
问题的本质就是:如果不特殊指明cookie作用的范围,那么会把cookie限定在特定的路径中
接下来来看看ChatGPT同志的解答吧:
要让写入的 Cookie 在整个域名下可用,而不仅仅是在当前页面路径下,你可以设置 Cookie 的 path
参数为根路径(/
)。
根据你提供的代码,你可以通过修改 setcookie
函数调用的第四个参数来实现:
setcookie('user_uid', $user_uid, $cookie_expiration, '/');
上述代码中的 /
作为第四个参数传递给 setcookie
函数,表示 Cookie 的路径为根路径。这意味着 Cookie 将在整个域名下可用。
请注意,如果你的网站同时包含不同的子域名,例如 example.com
和 subdomain.example.com
,而你希望 Cookie 在整个域名和所有子域名中共享,你还需要设置 Cookie 的 domain
参数。将 domain
参数设置为顶级域名,以便在所有子域名中共享 Cookie:
setcookie('user_uid', $user_uid, $cookie_expiration, '/', '.example.com');
// 设置其它 Cookie...
在上面的示例中,将 .example.com
作为 domain
参数传递给 setcookie
函数,以实现在 example.com
域名和所有其子域名中共享 Cookie。
请根据你的实际需求选择适当的 path
和 domain
参数,并进行相应的修改。这样你的 Cookie 将在整个域名下可用。
后日谈
真可谓是一个小小的参数引发的血案了
看看这commit记录,真可谓坑的不轻
这次的,怎一个坑字了得