当前位置: 首页 > article >正文

说说webpack proxy工作原理?为什么能解决跨域

webpack-dev-server 提供了一个 proxy 功能,可以帮助开发者在本地开发时解决跨域问题。要理解其工作原理以及为什么可以解决跨域问题,首先我们需要了解两个关键概念:跨域问题代理的工作方式

1. 跨域问题的本质

跨域问题是浏览器的同源策略(Same-Origin Policy)引起的。浏览器会限制从一个源(协议、域名、端口)发起的请求访问另一个源的资源。具体来说,以下任意一项不同都被认为是跨域:

  • 协议(如 http://https://
  • 域名(如 example.comapi.example.com
  • 端口(如 http://localhost:3000http://localhost:8000

在前端开发中,通常会遇到这种情况:前端应用运行在 http://localhost:8080,而后端 API 服务器运行在 http://localhost:3000。由于端口不同,它们被认为是不同的源,直接请求后端 API 会触发跨域问题。

2. webpack proxy 的工作原理

webpack-dev-server 提供的 proxy 功能通过代理服务器的形式绕过了浏览器的同源策略。其工作原理可以简单描述为:

  1. 请求拦截:当浏览器向开发服务器(如 http://localhost:8080)发送请求时,webpack-dev-server 会检查该请求的路径是否符合代理规则。

  2. 请求转发:如果符合代理规则,webpack-dev-server 会将该请求转发(代理)到目标服务器(如 http://localhost:3000)。从浏览器的角度来看,它的所有请求都还是发往 http://localhost:8080,所以不会触发跨域问题。

  3. 响应回传:目标服务器(如后端 API)接收到请求后,处理并返回响应。webpack-dev-server 代理服务器收到响应后,将其再转发给浏览器。整个过程对浏览器是透明的,浏览器并不知道请求实际上是由代理服务器转发的。

通过这种方式,浏览器只与 webpack-dev-server 通信,而不是直接与后端服务器通信,因此避免了跨域限制。

3. 为什么能解决跨域问题

通过代理的方式,webpack-dev-server 使浏览器始终认为它是在与同源的服务器(即 localhost:8080)进行通信,而实际的请求是在服务器端完成的跨域。因为跨域请求发生在服务器端,而不是浏览器端,服务器之间的通信没有同源策略的限制,所以可以正常请求不同源的资源。

4. 配置示例

一个典型的 proxy 配置如下:

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
        pathRewrite: { '^/api': '' },
      },
    },
  },
};
  • /api:匹配所有以 /api 开头的请求路径。
  • target:指向目标服务器地址(如 http://localhost:3000)。
  • changeOrigin:设置为 true 后,代理服务器会修改请求头中的 Host 字段,使其与目标服务器一致。
  • pathRewrite:重写路径规则,这里将 /api 去掉,使得请求路径与目标服务器匹配。

5. 总结

webpack-dev-serverproxy 通过在开发服务器上代理请求,将前端发向开发服务器的请求转发给后端实际的 API 服务器,从而避免了浏览器的同源策略限制,解决了跨域问题。代理的本质是浏览器只与同源的服务器通信,而跨域请求则由服务器进行,绕过了浏览器的跨域安全限制。


http://www.kler.cn/a/384933.html

相关文章:

  • Hive 查询(详细实操版)
  • 【系统架构设计师】高分论文:论企业应用系统的分层架构风格
  • 面试题分享11月5日
  • 【大数据学习 | kafka高级部分】文件清除原理
  • 如何为数据看板产品接入实时行情接口并展示行情
  • HT32201 2x15W+30W免电感2.1声道D类音频功放
  • Docker篇(registry私服)
  • 电路设计中的防接反电路
  • 《我的百科全书》——持续更新
  • 细说STM32单片机USART中断收发RTC实时时间并改善其鲁棒性的方法
  • 《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
  • git中的gitignore文件
  • PHP+MySQL开发的一套招聘管理系统开发案例源码功能介绍
  • Dockerfile的使用
  • 深入理解RocketMQ延迟消息机制原理
  • 2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
  • LabVIEW编程过程中为什么会出现bug?
  • 算法训练(leetcode)二刷第十九天 | *39. 组合总和、*40. 组合总和 II、*131. 分割回文串
  • [沫忘录]Redis 持久化
  • 分割回文串(DFS)
  • 技术分享 | 大语言模型赋能软件测试:开启智能软件安全新时代
  • explain执行计划分析 ref_
  • 【数据结构】Java 集合 Set 接口及其实现类的定义简介
  • 测试-正交表与工具pairs的介绍使用(1)
  • Qt字符编码
  • Matlab实现海马优化算法(SHO)求解路径规划问题