我在开发过程中,想从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请求,
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接口代码:
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配置改了一下:
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端口的子目录路径,所以就设置成功了。
因为是菜鸟程序员,所以可能对其中原理的理解不是很透彻,也不知道这么解释是不是正确的,希望有大牛可以指出不对的地方。希望能对遇到相同问题的人给点帮助!