最近写项目碰到个前后端分离的问题,踩了不少坑,给大家分享一些经验。
项目是传统的项目,没有做前后端分离,现在根据业务现状,需要改成前后端分离的形式去做开发,上来就碰到个头大的事,cookie没办法在前端后端进行传递保证登录状态,为了解决这个问题试了很多办法都不行,包括:
这种设置只能解决跨域访问接口的问题,但是解决不了跨域传递cookie的问题。
2、后端增加一个返回cookie的接口,前端手动赋值传给后端,结果浏览器报错“refuse to unsafe cookie”。事实证明,浏览器的安全策略很到位,绕不过去。
cookie无法传递的根本原因是浏览器对于cookie的同源策略限制,也就是必须要保证cookie是同一域名下,且path也正确,才可以使用cookie进行传递,比如www.a.com的接口返回的cookie没法在www.b.com中使用。
最后没办法了,最后上大招了,用了Nginx做反向代理解决跨域问题,使用Nginx中也是碰到了问题给大家讲一下。
首先说一下,十分推荐大家使用Nginx进行前后端分离,因为可以保证网站中所有请求都在一个域名之下,不用考虑跨域的问题了,而且Nginx的使用也没有很多开发初学者想的那么难,只要掌握基本的原理就可以了。
先从网上下载Nginx:nginx: download,我用的1.20.1版本。
然后修改Nginx配置文件,直接给到我的Nginx的配置文件:
server {
listen 443 ssl; //开启ssl
server_name dev.dachong.com; //域名
ssl_certificate e:/cert/1_dev.dachong.com_bundle.crt; //crt证书路径
ssl_certificate_key e:/cert/2_dev.dachong.com.com.key; //key证书路径
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location /webapi { //后端url的path
root html;
index index.html index.htm;
proxy_pass https://localhost:1001/; //后端域名,注意要带斜杠
proxy_cookie_path /webapi /; //修改cookie的path为全路径/
}
location / {
root html;
index index.html index.htm;
proxy_pass https://localhost:1000/; //前端域名,注意要带斜杠
}
}
因为我这个用到了https,所以需要导入证书,证书是在腾讯云下载的,配置文件里的证书路径可以用绝对路径(我用的绝对路径),也可以用相对路径,默认是相对的,cert可以放在conf文件夹下。配置文件写完了之后,直接双击nginx.exe启动就好了,so easy!
此时在打开浏览器输入dev.dachong.com即可访问到前端页面,dev.dachong.com/webapi即可访问到后端服务器。
要注意一点,给nginx配好域名或者用80端口也可以,不能用IP加非80端口号形式,如果你nginx没有域名,直接用的ip:端口,cookie的domain会是ip,但是调接口用的ip:端口,还是会导致cookie附带不上。