tools后端之美-ASP.net

nginx反向代理-解决前端跨域问题

2018-08-02  本文已影响117人  叶小七的真命天子

前后端分离现在已成主流系统架构设计方式,后台和前台页面分开部署,以便后期维护和扩展,对运维工作十分有利,不会出现因为后台崩溃而导致前台页面访问不了的情况。但是随之而来的就会产生跨域问题。

一、跨域的定义

浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域

1.1域名:
主域名不同:
http://www.fengleaf.cn/experience
http://www.sina.cn/experience
子域名不同:
http://www.ad.fengleaf.cn/experience
http://www.movie.fengleaf.cn/experienc
域名和域名ip:
http://www.baidu.com/index.html
http://180.149.132.47/test.js
1.2端口:
http://www.fengleaf.cn:8080/index.html
http://www.fengleaf.cn:8081/index.html
1.3协议:
http://www.fengleaf.cn
https://www.fengleaf.cn
备注:
1、端口和协议的不同,只能通过后台来解决
2、localhost和127.0.0.1虽然都指向本机,但也属于跨域

示例

前端node服务域名地址:http://localhost:3000
后端接口请求域名地址:http://www.fengleaf.cn/api~

在前端index.html中获取后台接口数据:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>跨域</title>
    <script src="./jquery.js"></script>
</head>

<body>
    <a id="linkBtn">获取接口服务数据</a>
    <textarea id="text" style="width: 400px; height: 100px;"></textarea>
    <script>
        $('#linkBtn').click(function () {
            $.ajax({
                url:'http://www.fengleaf.cn/api/skills',
                type: 'get',
                success: function (data) {
                    var result = JSON.stringify(data);
                    $("#text").val(result);
                }
            })
        })
    </script>
</body>
</html>

会发现直接拿“http://www.fengleaf.cn/api/skills”请求数据,浏览器报错,产生跨域问题:

image.png

二、nginx反向代理解决跨域

1、找到Nginx更目录下的nginx.conf文件,在http对象中添加一个sever,内容如下:

http: {
  server{
      listen 9000;
      server_name localhost;
      location / {
          proxy_pass http://127.0.0.1:3000/;
       }
      location /apis {
          rewrite  ^/apis/(.*)$ /$1 break;
          proxy_pass   http://www.fengleaf.cn;
       }
     }
}

修改完成后执行:sudo nginx -s reload,重新启动Nginx服务

nginx常用命令:

开启nginx服务
sodu nginx 服务器重启命令,关闭
sudo nginx -s reload :修改配置后重新加载生效
关闭nginx:
sudo nginx -s stop :快速停止nginx
sudo quit :完整有序的停止nginx

配置解释:

1.由配置信息可知,我配了一个端口代理,将3000端口代理到了9000端口,这样网站前端页面就可经过localhost的9000端口进行访问,也能使用3000端口访问。

2.我们特殊配置了一个“/apis”目录的访问,并且对url执行了重写,最后使以“/apis”开头的地址都转到“http://www.fengleaf.cn”进行处理。

3.rewrite ^/apis/(.)/1 break; 代表重写拦截进来的请求,并且只能对域名后边以“/apis”开头的起作用,例如www.a.com/apis/msg?x=1重写。只对/apis重写。
rewrite后面的参数是一个简单的正则 ^/apis/(.
),1代表正则中的第一个(),$2代表第二个()的值,以此类推。break代表匹配一个之后停止匹配。

2、更改ur路径
既然配置了nginx,那么所有的访问都要走nginx,而不是走网站原本的地址。所以要修改前端页面的ajax访问地址,把访问地址由
http://www.fengleaf,cn/api/skills”改成“/apis/api/skills”。如下代码:

$('#linkBtn').click(function () {
  $.ajax({
          url: '/apis/api/skills',
          type: 'get',
          success: function (data) {
              var result = JSON.stringify(data);
              $("#text").val(result);
          }
   })            
})

浏览器输入localhost:9000,点击按钮发起请求:


image.png
image.png

已经没有跨域问题了。

三、开发环境解决跨域

nginx一般是用来在生产版本部署时才用到,在开发环境中,可以使用其他的更简便的方法

vue.js项目开发模式跨域设置:在config下的index.js文件中配置proxyTable。

未完待续。。。

上一篇下一篇

猜你喜欢

热点阅读