前端本地开发中,代理配置是如何解决跨域的?

news/2025/2/22 18:08:08/

文章目录

  • 跨域(Cross-Origin)
  • 开发代理
  • 原理
    • 先说一下三个概念
    • 那代理到底是如何解决跨域的?
  • 补充
  • 参考视频

跨域(Cross-Origin)

这里再说一下跨域的概念吧。

在Web开发中,浏览器限制了从一个不同来源(协议、域名或者端口) 获取资源的访问。
当在一个页面中通过 Ajax 或者 JavaScript 访问其他域名下的资源时,就会产生跨域问题。

举些例子:

  • http://example.com | https://example.com 域名相同,但协议不同(http 和 https)
  • http://example.com | http://example.com:8080 域名相同,但端口号不同
  • http://example.com | http://test.example.com 主机名(子域)不同
  • https://example.com | https://anotherdomain.com 域名不同
  • file://localhost/index.html | http://example.com 文件协议和HTTP协议之间的跨域

开发代理

在开发过程中,我们可以通过代理相关的配置,来使得我们可以正常开发。

create-react-app

// setupProxy.js
const { createProxyMiddleware } = require('http-proxy-middleware');module.exports = function(app) {app.use('/api',createProxyMiddleware({target: 'http://api.example.com',changeOrigin: true,}));
};

vite

// vite.config.jsmodule.exports = {server: {proxy: {'/api': {target: 'http://api.example.com',changeOrigin: true,rewrite: path => path.replace(/^\/api/, ''),},},},
};

umi

// .umirc.jsexport default {proxy: {"/api": {target: "http://api.example.com",changeOrigin: true,pathRewrite: { "^/api": "" },},},
};

原理

先说一下三个概念

  • 文章开头说的跨域的概念,是谁限制了资源访问?
  • cra、vite、umi都有开发服务器的概念,前端代码运行在了它们的开发服务器上
  • 实际上跨域请求,请求正常发送了,被请求的一方是也是正常返回了的,只是浏览器限制了资源访问。并不是说因为跨域了,连请求都没有发送。

那代理到底是如何解决跨域的?

  1. 我是运行在node端的开发服务器,我跑起来了,运行着前端代码
  2. 工程里有代理配置呀,看来我要拦截一下符合条件的请求了
  3. 来了一个请求:post("/api/getList");符合/api我要把他拦下来
  4. 他要代理到哪呢,我看看targerhttp://api.example.com,还需要rewrite/api删掉,那我实际的请求就是http://api.example.com/getList
  5. ok,我来发请求吧,我是node端服务器,不存在跨域问题。ok,拿到了返回结果。
  6. 我把结果给post("/api/getList")了。他请求的是http://localhost/api/getList,他不存在跨域问题。
  7. 结束

补充

另外只要返回的结果告诉浏览器,请求我的网址没关系,你别拦,我的内容给他就行。也不会产生跨域问题。
在这里插入图片描述
https://baike.baidu.com/里请求了https://miao.baidu.com/abdr。返回的内容(Response Header)告诉浏览器:允许https://baike.baidu.com/访问我(Access-Control-Allow-Origin),你不用拦。

参考视频


http://www.ppmy.cn/news/1158974.html

相关文章

智能垃圾桶丨悦享便捷生活

垃圾桶是人们日常生活所必不可少的必需品,它让生活中所产生的垃圾有了一个正确的存放地方。随着生产技术的迅速发展,垃圾桶也得以更新换代。由最初的简单式的圆筒式垃圾桶,到现在出现的感应式垃圾桶、智能语音控制垃圾桶,垃圾桶也…

lvgl 页面管理器

lv_scr_mgr lvgl 界面管理器 适配 lvgl 8.3 降低界面之间的耦合使用较小的内存,界面切换后会自动释放内存内存泄漏检测 使用方法 在lv_scr_mgr_port.h 中创建一个枚举,用于界面ID为每个界面创建一个页面管理器句柄将界面句柄添加到 lv_scr_mgr_por…

unigui添加ssl(https)访问的方法

首先到腾讯云或者阿里云去申请免费的证书,前提是在该服务商那有申请过域名,怎么找出这个界面?网页顶部一般都有个搜索框,输入【证书】或者【SSL】就能看到了,然后点击申请免费证书,把解析信息填入自己的域名…

Android 自定义view 圆形进度条

Android 自定义view 圆形进度条 前言一、码前分析二、开码1.画笔2.弧度3.圆弧的位置4.暴露给外部设置进度条的方法三、使用四、完整代码 总结 前言 先来看看效果,大概要实现这么一个圆形的进度条 一、码前分析 要实现这么一个进度条的效果,实际上是要画…

苏东坡在元丰五年

北宋神宗元丰二年(1079年)十二月二十八日,震惊朝野上下的“乌台诗案” 正式结案:“祠部员外郎、直史馆苏轼责授检校水部员外郎、黄州团练副使,本州安置、不得签书公事,令御史台差人转押前去。” 元丰三年&…

Electron webview 和 渲染进程和主进程的通信方式

Electron 嵌入的页面中注入的是 preload.js 通过在标签中给 prelaod赋值,这里提到了 file://前缀,以及静态目录 static 怎么获取 实际代码,其中__static就是我们存放静态文件的地方,这个 static 是 electron 源代码根目录下的文件…

SSM - Springboot - MyBatis-Plus 全栈体系(二十五)

第五章 SSM 三、《任务列表案例》前端程序搭建和运行 1. 整合案例介绍和接口分析 1.1 案例功能预览 1.2 接口分析 1.2.1 学习计划分页查询 /* 需求说明查询全部数据页数据 请求urischedule/{pageSize}/{currentPage} 请求方式get 响应的json{"code":200,"f…

VulnHub lazysysadmin

一、信息收集 1.nmap扫描开发端口 开放了:22、80、445 访问80端口,没有发现什么有价值的信息 2.扫描共享文件 enum4linux--扫描共享文件 使用: enum4linux 192.168.103.182windows访问共享文件 \\192.168.103.182\文件夹名称信息收集&…