您的位置:首页 > 编程语言 > PHP开发

记录一下自己在php中设置cookie遇到的一个问题

2020-04-25 08:34 579 查看

我在开发过程中,想从php请求接口中就设置完cookie,然后客户端发送请求之后,不用使用document.cookie来设置cookie,但是在这个过程中,遇到了这个问题。

开始我弄了一个简单的测试页面(ceshi.html)和一个用thinkphp5弄得简单得php接口,然后开启了本机的nginx,页面的地址是http://localhost/dist/ceshi.html,接口的地址是http://localhost:4100/index/index/testAxios,具体代码如下:

这是ceshi.html的使用axios发送的post请求,

[code]const postData = new URLSearchParams();
postData.append('driverName', 'xiaorenyi');
postData.append('phone', '18100171354');
axios.post('http://localhost:4100/index/index/testAxios', postData, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}).then(
res => {
console.log(res);
onsole.log(document.cookie);
},
err => {
console.log(err);
}
)

这是php接口代码:

[code]public function testAxios()
{
// $name = Request::instance()->post('driverName');
$res = setcookie('worldludan_keys', 'HelloWorld', time() + 14400, '/');
echo $res;
}

做好这两个东西的准备,我就进入了愉快的测试之旅,打开浏览器输入http://localhost/dist/ceshi.html,因为请求是打开浏览器时就自动发送的,所以打开F2,在network中查看到请求已经发送成功,并且有相应的响应数据。但是,但是,我发现cookie并没有我想要的worldludan_keys,度娘了很久,也按照很多帖子进行了修改,有帖子说,你设置cookie的有效期是不是过期了,还有的时setcookie第四个参数path设置的问题,试了很多解决方法,都没有解决掉我的问题。

机缘巧合,我直接在浏览器地址栏输入http://localhost:4100/index/index/testAxios,而不是通过ceshi.html页面去发送请求,这时候我发现cookie成功设置了。我检查了一下两个不同方式的network,区别在于这两种方式的Request Headers(请求头信息)是不一样的,贴上:

这是http://localhost/dist/ceshi.html的请求头信息,

这是http://localhost:4100/index/index/testAxios的请求头信息,

其实我也不知为什么两者的请求头信息差别这么大(希望一些大佬可以给小弟一些解答,感谢~~)。

我们回归正题,看着两个的请求头信息,我突然猜测可能是因为这个请求接口是在 :4100 端口下,所以我setcookie的path="/"会不会有可能只有在4100端口下才可能成功设置cookie呢。

怀着这个猜测,我尝试着把我本地nginx配置改了一下:

[code]location /tp/ {
rewrite /tp/(.*) /$1 break;
proxy_pass http://127.0.0.1:4100;
proxy_set_header Host 127.0.0.1:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

就是就是将4100端口重写了到了/tp路径下,就是当访问http:localhost/tp时,会定向到http://localhsot:4100下,这是我们把接口地址,修改成http://localhost/tp/index/index/testAxios,再一次的在地址栏中输入http://localhost/dist/ceshi.html,此时,cookie就成功设置了。

对此我自己的理解时,path为"/"的时候,就会是在80端口下,所以无论是 /dist 还是 /tp ,都是80端口的子目录路径,所以就设置成功了。

因为是菜鸟程序员,所以可能对其中原理的理解不是很透彻,也不知道这么解释是不是正确的,希望有大牛可以指出不对的地方。希望能对遇到相同问题的人给点帮助!

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Users77 发布了2 篇原创文章 · 获赞 0 · 访问量 83 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐