`
y806839048
  • 浏览: 1082558 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

实现前后分离解决的跨域问题

阅读更多

   用nginx做代理即可,前端连接nginx,nginx的localtion的时候匹配的是域名之后的路劲,然后更换的也是域名部分,后面的路径直接拼接

   当然也可写正则表达式重写,改变这种拼接的规则

以下的例子是重写之后的

rewrite  ^.+apis/?(.*)$ /$1 break;

 

 

这里,我们利用Nginx的反向代理功能解决跨域问题,至于,什么是Nginx的反向代理,大家就请自行百度或者谷歌吧。

 

nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。对于浏览器来说,访问的就是同源服务器上的一个url。而nginx通过检测url前缀,把http请求转发到后面真实的物理服务器。并通过rewrite命令把前缀再去掉。这样真实的服务器就可以正确处理请求,并且并不知道这个请求是来自代理服务器的。

 

具体解决方案如下:

 

在nginx.conf中编辑

 

server {

        location / {

            root   html;

            index  index.html index.htm;

            //允许cros跨域访问

            add_header 'Access-Control-Allow-Origin' '*';

 

        }

        //自定义本地路径

        location /apis {

            rewrite  ^.+apis/?(.*)$ /$1 break;

            include  uwsgi_params;

            proxy_pass   http://www.lyz.com;

       }

}

然后我把项目部署在nginx的html根目录下,在ajax调用时设置url从http://www.lyz.com/apistest/test变为/apis/apistest/test然后成功解决。

 

比如我之前请求的Ajax如下:

 

$.ajax({

        type:"post",

        dataType: "json",

        data:{'parameter':JSON.stringify(data)},

        url:"http://www.lyz.com/apistest/test",

        async: flag,

        beforeSend: function (xhr) {

 

            xhr.setRequestHeader("Content-Type", submitType.Content_Type);

            xhr.setRequestHeader("user-id", submitType.user_id);

            xhr.setRequestHeader("role-type", submitType.role_type);

            xhr.setRequestHeader("access-token", getAccessToken().token);

        },

        success:function(result, status, xhr){

     

        }

        ,error:function (e) {

            layerMsg('请求失败,请稍后再试')

        }

    });

修改成如下的请求即可:

 

$.ajax({

        type:"post",

        dataType: "json",

        data:{'parameter':JSON.stringify(data)},

        url:"/apis/apistest/test",

        async: flag,

        beforeSend: function (xhr) {

 

            xhr.setRequestHeader("Content-Type", submitType.Content_Type);

            xhr.setRequestHeader("user-id", submitType.user_id);

            xhr.setRequestHeader("role-type", submitType.role_type);

            xhr.setRequestHeader("access-token", getAccessToken().token);

        },

        success:function(result, status, xhr){

     

        }

        ,error:function (e) {

            layerMsg('请求失败,请稍后再试')

        }

    });

至此,问题解决。

 

 例如:

 

前后分离的时候,第一个login页面是在前端,其他的页面也是在前端,此时拦截的是前端发起接口的路径特征

 

对于网上源码需要改造成前后分离的,此时nginx的跨域处理不要误以为直接访问nginx到源码首页就可-----这种只是代理分发---负载均衡

而是需要拦截前端发起请求接口的特征

 

前端项目源码:

 

export default {

  dev: {

    host: '/api/v3',

    shareHost: '/share.html'

  },

  production: {

  //  host: '/api/v1',

    host: '/api/v3',

    shareHost: '/share.html'

  }

}

 

配置:

upstream apachephp  {

    server 192.168.202.183:8080; #Apache-----后端项目源码地址

}

 

    server {

        listen       8089;

        server_name  localhost;

 

        #charset koi8-r;

 

        #access_log  logs/host.access.log  main;

 

       

 

     location / {---------------一般用精确的项目特征路劲

        proxy_pass  http://apachephp;

 

        #Proxy Settings

        proxy_redirect     off;

        proxy_set_header   Host             $host;

        proxy_set_header   X-Real-IP        $remote_addr;

        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        proxy_max_temp_file_size 0;

        proxy_connect_timeout      90;

        proxy_send_timeout         90;

        proxy_read_timeout         90;

        proxy_buffer_size          4k;

        proxy_buffers              4 32k;

        proxy_busy_buffers_size    64k;

        proxy_temp_file_write_size 64k;

   }

 

     location /api {---------------一般用精确的项目特征路劲,域名部分替换

        proxy_pass  http://apachephp;

 

        #Proxy Settings

        proxy_redirect     off;

        proxy_set_header   Host             $host;

        proxy_set_header   X-Real-IP        $remote_addr;

        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        proxy_max_temp_file_size 0;

        proxy_connect_timeout      90;

        proxy_send_timeout         90;

        proxy_read_timeout         90;

        proxy_buffer_size          4k;

        proxy_buffers              4 32k;

        proxy_busy_buffers_size    64k;

        proxy_temp_file_write_size 64k;

   }

 

 

 

 

 

原文链接:https://blog.csdn.net/l1028386804/article/details/79488328

分享到:
评论

相关推荐

    nginx解决前后分离开发跨域问题

    nginx中所有的配置都已弄好,只需下载后更改前端代码的地址和需要代理的地址就帮你实现反向代理,解决跨域问题,配置文件中需要更改的地方就两个,在文件中已经为你标明。

    vue+springboot前后端分离实现单点登录跨域问题解决方法

    最近在做一个后台管理系统,前端是用时下火热的vue.js,后台是基于springboot...我面临的第一个问题是跨域,浏览器控制台直接报CORS,以我多年开发经验,我果断在后台配置了跨域配置,代码如下: @Configuration publi

    Tomcat+Nginx反向代理部署前后端分离项目解决跨域问题

    最近自己做了一个前后端分离项目,前端采用HBuilderX开发,后端采用IDEA开发,在本地开发也跨域,部署到云服务器也跨域,下面介绍两种解决方案。 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定...

    详解VueJs前后端分离跨域问题

    本篇文章主要介绍了详解VueJs前后端分离跨域问题,详细介绍了在项目内设置代理(proxyTable)的方式来解决跨域问题,有兴趣的可以了解一下

    tomcat9(已解决呢跨域).zip

    设置Tomcat跨域,可以实现前后端分离,这是个已经配置好,下载后解压就可以直接使用的Tomcat。 Download and Install a Java SE Runtime Environment (JRE)

    SSM框架整合Dome(前后端分离)

    该资源Spring、SpringMVC、Mybatis三大框架搭建的前后端分离项目,解决了前后端分离出现的跨域问题及乱码问题

    springboot实现前后端分离项目

    springboot实现后端接口并通过前端展示, 通过springboot实现后端接口,再通过axios再前端解决跨域问题后用vue在前端展示数据,一个简单的前后端分离项目

    vue2 前后端分离项目ajax跨域session问题解决方法

    最近学习使用vuejs前后端分离,重构一个已有的后台管理系统,遇到了下面这个问题: 实现跨域请求时,每次ajax请求都是新的session,导致无法获取登录信息,所有的请求都被判定为未登陆。 1、 vuejs ajax跨域请求 ...

    跨域解决的两种方法

    跨域:个人简单的理解就是,你本地localhost:8080访问另一个地址192.168.0.1,会出现跨域,原因是跨域要实现同源策略,即:HTTP//IP:port要一样,HTTP和HTTPS会出现跨域,还有就是orgin请求来源是否允许

    Nginx 解决WebApi跨域二次请求以及Vue单页面的问题

    由于项目是前后端分离,API接口与Web前端 部署在不同站点当中,因此在前文当中WebApi Ajax 跨域请求解决方法(CORS实现)使用跨域处理方式处理而不用Jsonp的方式。 但是在一段时间后,发现一个很奇怪的问题,每次...

    nginx+vue.js实现前后端分离的示例代码

    适合解决跨域问题和反向代理(因为谁也不想看到在本域名下看到访问其他域名的情况发生,跨域可导致csrf攻击,这是本文用它的第二个原因) 占用内存少,秒启,能快速切换结点,防止宕机 2.es6 是ECMAScript的第六个版本,如果...

    使用springboot+mybatis+Vue2.0+elementUI实现简单的登录注册及用户信息获取。

    本demo实现了简单的登录、注册、获取用户信息三个功能,其中包含密码加密,解决了前后端分离项目常见的跨域问题及session问题,界面清晰简单,后台分层清晰,逻辑清楚。 值得一看。 项目结构:ajax_test为后端项目,...

    利用Nginx代理如何解决前端跨域问题详析

    本文将讲述如何使用 Nginx 在 Web 前后端分离开发中实现路由的转发。 Web 开发通常使用的是前后端分离的开发模式,即前端和后端分别进行开发,前端通过 Ajax 请求后端的接口,将获取数据将数据渲染到页面上。前端...

    Vue 3.x+axios跨域方案的踩坑指南

    不过本篇文章,讲的并不是如何解决这样的跨域问题,而是我在找如何解决这个问题的路上遇到的坑。 其实,在前端工程化大行其道的现在,前后端已经分离开来,前端为了提高工作流效率往往自己开一个小型的服务器,就...

    Vue-cli3.x + axios 跨域方案踩坑指北

    不过本篇文章,讲的并不是如何解决这样的跨域问题,而是我在找如何解决这个问题的路上遇到的坑。 其实,在前端工程化大行其道的现在,前后端已经分离开来,前端为了提高工作流效率往往自己开一个小型的服务器,就...

    基于SpringBoot+mybatis+vue.js实现电影院会员管理系统源码+项目报告+项目说明(高分课设).zip

    npm run dev 后,修改utils/request.js下baseURL=”/api”,开启node反向代理服务器,解决跨域问题,然后启动cinema后端项目,在浏览器上输入 http://localhost:8080 即可以前后端分离方式运行(也可以npm run build后将...

    DRF跨域后端解决之django-cors-headers的使用

    在使用django-rest-framework开发项目的时候我们总是避免不了跨域的问题,因为现在大多数的项目都是前后端分离,前后端项目部署在不同的web服务器上,因为我们是后端程序员,因此我要通过后端的程序实现跨域。...

    SpringBoot整合websocket实现数据实时推送

    通过呆着读者手写速成版本的websocket入门案例,以项目案例的方式带你...4.前后端分离项目的Cros跨域问题解决 阅读建议: 此资源以案例代入知识点的方式,让你快速上手websocket的相关学习,可针对项目本身向外扩展。

Global site tag (gtag.js) - Google Analytics