Cookie踩坑记——cookie设置不生效

9aed3359d109b3deb7351bae89bf6c81820a4c97

最近在写一个新的项目,采用的依然是传统的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 将在整个域名下可用。

后日谈

真可谓是一个小小的参数引发的血案了

image

看看这commit记录,真可谓坑的不轻

这次的,怎一个字了得

点赞
  1. GoodBoyboy说道:
    Google Chrome Windows 10/11
    结果用户直接设置禁止所有cookie :huaji:
    1. 晓空说道:
      Google Chrome Windows 10/11
      :huaji2: 那就别用了

发表回复

电子邮件地址不会被公开。必填项已用 * 标注