当前位置: 首页 > article >正文

Nginx 跨域 + 无法设置 Cookie 解决办法

今天来分享一下关于项目部署上线时怎么解决跨域问题!!!

首先感谢一下大佬的方法,才让这个困扰我很久的问题得以解决!!!
这也是我请教大佬才解决的问题,大佬和我说,这是他耗费两周才解决的问题,我这也是属于前人栽树后人乘凉了,嘿嘿嘿!!!

前端问题

前端没有携带 cookie 导致后端识别不到

1) 前端 axios 是否开启了 withCredentials=true

2) 在 OpenAPI 的那边配置项,设置下 withCrendential

首先 F12 看 login 接口对应的网络请求有没有 ⚠️,如果有那是后端的问题,如果没有那是前端的问题

在这里插入图片描述

后端问题
YML 配置

复制代码
server:
  servlet:
    session:
      cookie:
        domain: 域名或者IP

http 环境就不要使用 secure 和samesite

使用宝塔跨域
在这里插入图片描述
在这里插入图片描述

后端相关的反向代理+跨域

server {
    # 这个监听的端口任意都行,但是要注意前端要请求这个端口
    listen       9090;
    server_name  localhost;


    location / {
        # 禁止非 GET|POST|HEAD|OPTIONS|PUT|PATCH|DELET 的请求
        if ( $request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|PATCH|DELETE)$ ) {
            return 444;
        }

        set $origin $http_origin;
        # 重点!比如:
        # $origin !~ '^http?://leikooo\.com$
        # $origin !~ '^http?://127.0.0.1$
        if ($origin !~ '^http?://服务器IP或者域名$') {
            set $origin 'http://服务器IP或者域名';
        }

        if ($request_method = 'OPTIONS') {

            add_header 'Access-Control-Allow-Origin' "$origin" always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Content-Type, Accept, Authorization' always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;

            add_header Access-Control-Max-Age 1728000;
            add_header Content-Type 'text/plain charset=UTF-8';
            add_header Content-Length 0;
            return 204;
        }


        if ($request_method ~ '(GET|POST|PATCH|PUT|DELETE)') {
            add_header Access-Control-Allow-Origin "$origin" always;
            add_header Access-Control-Allow-Methods 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
            add_header Access-Control-Allow-Headers 'Content-Type, Accept, Authorization' always;
            add_header Access-Control-Allow-Credentials true always;
        }
        # 反向代理到后端具体运行的端口
        proxy_pass http://localhost:后端实际运行端口;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr; 

    }
}

注意:

  1. 前端请求 9090 (上面 server 模块下 listen 的端口)而不是直接请求后端实际运行端口

  2. 直接请求后端端口,那么 Nginx 就失去了存在的意义!

  3. 宝塔 + 服务器放行 9090 端口,这个要注意!!(具体看自己写的是哪个端口)

  4. 完成 添加 nginx 配置 + 放行端口 正常就没什么问题了!

使用原生 Nginx 跨域

经过实际测试,用 nginx 跨域就可以解决

user  root;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  application/octet-stream;
    access_log  logs/access.log;

    sendfile        on;
    keepalive_timeout  65;

    #gzip  on;

    # 前端配置不是重点
    server {
        listen       80;
        server_name localhost ;

      	root /root/app/dist;
        # 访问默写前端页面 404 就是没加下面这行的原因
        try_files $uri $uri/ /index.html;
        
        location / {
            index  index.html index.htm;
        }
   }  

   # 后端相关的反向代理+跨域
   server {
        # 这个监听的端口任意都行,但是要注意前端要请求这个端口
        listen       9090;
        server_name  localhost;
        
      
        location / {
            # 禁止非 GET|POST|HEAD|OPTIONS|PUT|PATCH|DELET 的请求
            if ( $request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|PATCH|DELETE)$ ) {
                return 444;
            }
                
            set $origin $http_origin;
            # 重点!比如:
            # $origin !~ '^http?://leikooo\.com$
            # $origin !~ '^http?://127.0.0.1$
            if ($origin !~ '^http?://服务器IP或者域名$') {
                set $origin 'http://服务器IP或者域名';
            }

            if ($request_method = 'OPTIONS') {

                add_header 'Access-Control-Allow-Origin' "$origin" always;
                add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
                add_header 'Access-Control-Allow-Headers' 'Content-Type, Accept, Authorization' always;
                add_header 'Access-Control-Allow-Credentials' 'true' always;

                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain charset=UTF-8';
                add_header Content-Length 0;
                return 204;
            }
                

            if ($request_method ~ '(GET|POST|PATCH|PUT|DELETE)') {
                add_header Access-Control-Allow-Origin "$origin" always;
                add_header Access-Control-Allow-Methods 'GET, POST, PATCH, PUT, DELETE, OPTIONS' always;
                add_header Access-Control-Allow-Headers 'Content-Type, Accept, Authorization' always;
                add_header Access-Control-Allow-Credentials true always;
            }
            # 反向代理到后端具体运行的端口
            proxy_pass http://localhost:后端实际运行端口;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr; 

        }
    }
}

注意:

1)前端请求 9090 而不是直接请求后端实际运行端口

2)服务器放行 9090 端口,这个要注意!!(具体看自己写的是哪个端口)

使用 HTTPS

实际测试使用域名 + HTTPS 也可以解决

这里看一下大佬写的!!!

教程:https://www.code-nav.cn/post/1831983737277050881

BUG

  1. 前端使用域名,但是前端后端使用 ip ,导致 session 设置不上

解决:前后端统一,要用域名都用域名、IP 都用 IP

  1. 还是不行?

1)端口是否放行!!!

2)前端请求的端口是否是 Nginx listen 的端口,不要直接请求实际端口 !!!


http://www.kler.cn/a/308778.html

相关文章:

  • 学Linux的第八天
  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数
  • DHCP与FTP
  • 攻防世界37-unseping-CTFWeb
  • 如何在 CentOS 6 上设置 NFS 挂载
  • 产品经理如何使用项目管理软件推进复杂项目按时上线
  • 计算机网络17——IM聊天系统——客户端核心处理类框架搭建
  • 基于web的 BBS论坛管理系统设计与实现
  • 【AI学习笔记】初学机器学习西瓜书概要记录(一)机器学习基础知识篇
  • 苍穹外卖Day01-2
  • 机器人的静力分析与动力学
  • vue中解决上个路由的el-dialog遮罩层未关闭问题
  • mqtt整体了解
  • python实现多个pdf文件合并
  • 二十三种设计模式之适配器模式
  • 单调队列,LeetCode 2398. 预算内的最多机器人数目
  • ai 回答HFS是什么 HTTP的文件服务器是什么
  • 数据结构之排序算法的分析和应用
  • 【数据结构篇】~链表算法题3(环形链表)
  • C# net跨平台上位机开发(avalonia)附demo源码
  • 牛客背包问题练习 xinjun与阴阳师
  • 苍穹外卖学习笔记(八)
  • 【案例71】配置https之后 IE打不开登陆页面 Uclient没有问题
  • 《微信小程序实战(2) · 组件封装》
  • 【重学 MySQL】二十七、七种 join 连接
  • 宝塔Linux部署 Vue + Spring Boot + MySQL + Redis