使用Nginx部署OJ项目后?使用ip能正常访问,使用域名访问时登录不了?
发现问题
我把OJ系统按下面的步骤部署后,发现了一些问题


使用ip地址能访问能正常登录,使用域名登录后就立刻失效(主页显示未登录,点击做题再次跳转到登录页面)

发现/api/user/login请求能正常登录

但是api/user/get/login请求却获取不到登录状态

进入代码沙箱查看,发现是session被释放掉了

并且ip访问时cookie里有维持session,而域名访问时却没有
试了很多种方法,包括在后端设置cookieSerializer
https://blog.csdn.net/jefferyqjy/article/details/116211527

解决问题
苦一天半,无果,偶得大佬 bug制造师(星球id:10864-cq2022) 相助
大佬一眼发现问题所在

需要将openAPI.ts里的地址改为http://域名

然后在nginx配置location,让nginx代理所有ip:80/api的请求,然后转发到ip:8101

这样一来,前端调用后端时,就会先访问http:// zsp2023.top(openAPI.ts里设置的地址),由于访问的是80端口且请求带有/api,就会由nginx反向代理到8101端口
【到这时我才知道,原来nginx还可以代理后端,也终于明白了nginx反向代理的运行过程】
信心满满的再次访问域名,发现居然只有静态资源

不应该呀,我的后端是好好的呀(测试登录能正常使用)

于是直接访问80端口,不直接访问后端,而是通过nginx反向代理,测试反向代理是否生效
居然跑不通,不是吧,我好不容易走到这一步,你给我整这一死出

nginx的error日志,让我看看!!!
噢噢噢,ip地址写错了,少写了个2

那就改过来

这回应该没问题了,OJ,启动!!!


大功告成!!!
所以之前ip能跑通,是因为刚好我的openAPI.ts写的就是后端地址ip:8101,使用ip访问时请求没经过nginx代理就直接发送到了后端,恰好浏览器地址栏里的ip和openAPI.ts里的是一样的,满足同源策略
【同源策略:同协议(https/http),同域名(ip和域不能算相同),同端口。满足同源策略的cookie才会被共享,也无法发送ajax请求。https://blog.csdn.net/qq_42349528/article/details/123074877】
而使用域名访问时,浏览器地址栏里是域名而openAPI.ts里是ip,不满足同源策略,导致cookie不被共享而导致session失效,所以后端获取不到登录session导致/get/login失效
感谢OJ项目群里的大佬们帮忙,特别鸣谢大佬 bug制造师(星球id:10864-cq2022) !!!
