nginx 解决前后端跨域问题(已解决)

背景:后端java+前端vueJS+elementUI。部署时,ngixn监听80端口映射静态页面,后台接口jar包启动,后端启动端口我这边是81。

部署后报跨域错误,get |post请求没有问题,但是上传文件,解析文件时,提示跨域。我本地时运行正常的,之前部署的项目也没有问题,代码是一样的,很费解。

报错如下:

Access to XMLHttpRequest at 'http://121.37.159.214:81/students/importStudentSession'
 from origin 'http://121.37.159.214:8080' has been blocked by CORS policy: 
 No 'Access-Control-Allow-Origin' header is present on the requested resource.
 
 
 Access to XMLHttpRequest at   from origin 
 has been blocked by CORS policy: 
 No 'Access-Control-Allow-Origin' header is present on the requested resource.

 

解决了一周,尝试修改了VUEJS代码,后台拦截器都不成功。

后参考 https://www.cnblogs.com/zhengqing/p/11256417.html 

详细 配置了ngxin反向代理,之前理解的不深,简单配置,没有成功就放弃了。这次成功了。

配置文件如下:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;

  sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   E:\idea_workspace\jxjw_web\dist;
            index  index.html index.htm;
        }
    
        location ^~ /api {
            
            proxy_pass http://127.0.0.1:81/;
             proxy_set_header Host $host;
             # proxy_set_header作用:设置发送到后端服务器(上面proxy_pass)的请求头值  
            # 【当Host设置为 $http_host 时,则不改变请求头的值;
         
        proxy_set_header Host $host; 
  
        proxy_set_header X-Real-IP $remote_addr; # 在web服务器端获得用户的真实ip 需配置条件①    【 $remote_addr值 = 用户ip 】
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在web服务器端获得用户的真实ip 需配置条件②
        proxy_set_header REMOTE-HOST $remote_addr;
        # proxy_set_header X-Forwarded-For $http_x_forwarded_for; # $http_x_forwarded_for变量 = X-Forwarded-For变量

        }
      
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

     
    }


}
 

 关键在  location ^~ /api {proxy_pass http://127.0.0.1:81/;} 这里 ,之前 我直接 /api 是报404,匹配不上的

这样配置后,访问 你的域名:80/api 就会转发到 81 端口,前端用80 就可以,这样域名端口就都一样了,不存在跨域了。

但是 注意 : 1 、这些参数是要加上了,不然转发后,参数都丢失了,就报登录失败了。

         proxy_set_header Host $host;
             # proxy_set_header作用:设置发送到后端服务器(上面proxy_pass)的请求头值  
            # 【当Host设置为 $http_host 时,则不改变请求头的值
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; # 在web服务器端获得用户的真实ip 需配置条件①    【 $remote_addr值 = 用户ip 】
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在web服务器端获得用户的真实ip 需配置条件②
        proxy_set_header REMOTE-HOST $remote_addr;

2 、这里还有一个坑  proxy_pass http://127.0.0.1:81/; 最后要加/斜杠。不然会报SpringSecurity认证失败的错误。

参考 :https://www.cnblogs.com/hanstrovsky/p/11918890.html

至此, ngxin部署前后端分离项目,跨域问题完美解决。

猜你喜欢

转载自blog.csdn.net/somdip/article/details/108145776