aurora blog
  • JS

    • 基本汇总
    • Date时间
    • Array方法
    • String 方法
    • Object方法
    • RegExp正则
    • Es6 新特性等
    • Event-Loop
    • Http and Https
    • for in和for of区别
    • Web Worker
    • Promise && async
    • 堆内存 & 栈内存
    • JS设计模式探索
    • npm & yarn
    • Fetch和Axios的区别
    • 学习及面试问题整理
    • URL 输入到页面加载过程
    • 跨域&nginx本地项目代理
  • FE框架

    • react

      • 基本用法
      • react生命周期
      • hooks 16.8版本后
      • Route原理
      • Redux源码解析
      • React16 Fiber
      • React-VirtualDOM
      • React事件委托机制
    • vue

      • vue 基本用法
      • vue 生命周期
      • VirtualDOM
      • vue 事件委托
      • vue 架构
      • vue 状态管理
      • 问题等
    • React-Native

      • React-Native 基本用法
    • 微前端

      • 遇到的问题
    • 鸿蒙 harmony

      • harmony 基础
  • 构建工具

    • webpack

      • Webpack配置详解
      • Webpack的使用
      • Babel-polyfill
      • webpack面试题
    • vite

      • vite基本配置
  • Typescript

    • Typescript详解
  • Servers

    • Nodejs
    • Nginx
  • Git命令

    • git常用规范
  • 数据库

    • mongodb
    • mongodb
  • Other

    • Jenkins自动化部署

跨域&nginx本地项目代理

  • 什么是跨域
    • 什么是同源策略?
  • 如何解决跨域?
    • CORS
    • JSONP
    • Nginx 反向代理
    • Websocket
    • window.postMessage
    • document.domain + Iframe
    • window.location.hash + Iframe
    • window.name + Iframe
    • 参考文章
  • 本地项目通过nginx代理
    • host文件修改指向
    • nginx解决端口问题
    • 流程解析
    • 参考文章

什么是跨域

跨域是指浏览器允许向服务器发送跨域请求,从而克服Ajax只能同源使用的限制

什么是同源策略?

「protocol(协议)、domain(域名)、port(端口)三者一致。」

「同源策略」是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。

如何解决跨域?

CORS

跨域资源共享(CORS) 是一种机制,它使用额外的HTTP头来告诉浏览器 让运行在一个 origin (domain) 上的 Web 应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

在 cors 中会有简单请求和复杂请求的概念

使用 IE<=9, Opera<12, or Firefox<3.5 或者更加老的浏览器,这个时候请使用 JSONP

参考文章

JSONP

  • JSONP 主要就是利用了script标签没有跨域限制的这个特性来完成的。
  • 仅支持 GET 方法
<script type="text/javascript">  
window.jsonpCallback = function(res) {
        console.log(res);  
    };
</script>
<script  src="http://localhost:8080/api/jsonp?msg=hello&cb=jsonpCallback"  type="text/javascript"></script>

Nginx 反向代理

配置如下个菜单

Websocket

WebSocket 规范定义了一种 API,可在网络浏览器和服务器之间建立“套接字”连接,这种方式本质没有使用了 HTTP 的响应头, 因此也没有跨域的限制

window.postMessage

postMessage提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

otherWindow.postMessage(message, targetOrigin, [transfer]); 详细用法

document.domain + Iframe

该方式只能用于二级域名相同的情况下,比如 a.test.com 和 b.test.com 适用于该方式。 只需要给页面添加document.domain ='test.com'表示二级域名都相同就可以实现跨域。

window.location.hash + Iframe

通过 url 带 hash ,通过一个非跨域的中间页面来传递数据。

window.name + Iframe

iframe 的 src 属性由外域转向本地域,跨域数据即由 iframe 的 window.name 从外域传递到本地域

参考文章

参考文章

本地项目通过nginx代理

本地启动nginx并修改host文件

host文件修改指向

比如我这里新增设置了一个127.0.0.1 liyulaikkk.kaikeba.com的域名:
伪造本地的hosts文件,实现对域名的解析solarhost文件解释

nginx解决端口问题

server_name访问的地址与host一致 ,proxy_pass本地项目启动地址+端口

http {
//     省略配置
    server {
        listen 80;
        server_name liyulaimos.kaikeba.com;
        location / {
        proxy_pass http://127.0.0.1:3006;
        }
    }
    server {
        listen 80;
        server_name liyulaikkk.kaikeba.com;
        location / {
        proxy_pass http://127.0.0.1:3000;
        }
    }
}

流程解析

  1. 浏览器准备发起请求,访问http://mamage.leyou.com,但需要进行域名解析
  2. 优先进行本地域名解析,因为我们修改了hosts,所以解析成功,得到地址:127.0.0.1(本机)
  3. 请求被发往解析得到的ip,并且默认使用80端口:http://127.0.0.1:80 ,本机的nginx一直监听80端口,因此捕获这个请求
  4. nginx中配置了反向代理规则,将manage.leyou.com代理到http://127.0.0.1:9001
  5. 主机上的后台系统的webpack server监听的端口是9001,得到请求并处理,完成后将响应返回到nginx
  6. 主机上的后台系统的webpack server监听的端口是9001,得到请求并处理,完成后将响应返回到nginx
    流程图solar

参考文章

参考文章

最近更新:: 2021/9/1 17:43
Contributors: “liyulai”
Prev
URL 输入到页面加载过程