首页 > 其他分享 >说说webpack proxy工作原理?为什么能解决跨域?

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

时间:2024-05-15 18:08:22浏览次数:13  
标签:请求 webpack api proxy 服务器 跨域

一、是什么

webpack proxy,即webpack提供的代理服务

基本行为就是接收客户端发送的请求后转发给其他服务器

其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制)

想要实现代理首先需要一个中间服务器,webpack中提供服务器的工具为webpack-dev-server

webpack-dev-server

webpack-dev-server是 webpack 官方推出的一款开发工具,将自动编译和自动刷新浏览器等一系列对开发友好的功能全部集成在了一起

目的是为了提高开发者日常的开发效率,只适用在开发阶段

关于配置方面,在webpack配置对象属性中通过devServer属性提供,如下:

// ./webpack.config.js
const path = require('path')

module.exports = {
    // ...
    devServer: {
        contentBase: path.join(__dirname, 'dist'),
        compress: true,
        port: 9000,
        proxy: {
            '/api': {
                target: 'https://api.github.com'
            }
        }
        // ...
    }
}

devServetr里面proxy则是关于代理的配置,该属性为对象的形式,对象中每一个属性就是一个代理的规则匹配

属性的名称是需要被代理的请求路径前缀,一般为了辨别都会设置前缀为/api,值为对应的代理匹配规则,对应如下:

  • target:表示的是代理到的目标地址
  • pathRewrite:默认情况下,我们的 /api-hy 也会被写入到URL中,如果希望删除,可以使用pathRewrite
  • secure:默认情况下不接收转发到https的服务器上,如果希望支持,可以设置为false
  • changeOrigin:它表示是否更新代理后请求的 headers 中host地址

二、工作原理

proxy工作原理实质上是利用http-proxy-middleware 这个http代理中间件,实现请求转发给其他服务器

举个例子:

在开发阶段,本地地址为http://localhost:3000,该浏览器发送一个前缀带有/api标识的请求到服务端获取数据,但响应这个请求的服务器只是将请求转发到另一台服务器中

const express = require('express');
const proxy = require('http-proxy-middleware');

const app = express();

app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));
app.listen(3000);

// http://localhost:3000/api/foo/bar -> http://www.example.org/api/foo/bar

三、跨域

在开发阶段, webpack-dev-server 会启动一个本地开发服务器,所以我们的应用在开发阶段是独立运行在 localhost的一个端口上,而后端服务又是运行在另外一个地址上

所以在开发阶段中,由于浏览器同源策略的原因,当本地访问后端就会出现跨域请求的问题

通过设置webpack proxy实现代理请求后,相当于浏览器与服务端中添加一个代理者

当本地发送请求的时候,代理服务器响应该请求,并将请求转发到目标服务器,目标服务器响应数据后再将数据返回给代理服务器,最终再由代理服务器将数据响应给本地

 

在代理服务器传递数据给本地浏览器的过程中,两者同源,并不存在跨域行为,这时候浏览器就能正常接收数据

注意:服务器与服务器之间请求数据并不会存在跨域行为,跨域行为是浏览器安全策略限制

参考文献

  • https://webpack.docschina.org/configuration/dev-server/#devserverproxy

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:请求,webpack,api,proxy,服务器,跨域
From: https://www.cnblogs.com/smileZAZ/p/18194442

相关文章

  • Nginx配置允许跨域
    要在Nginx中配置允许跨域(Cross-OriginResourceSharing,CORS),你需要修改Nginx的配置文件(通常是nginx.conf或者某个包含在nginx.conf中的单独的配置文件)。下面是一个基本的例子,展示了如何在Nginx中设置CORS:打开你的Nginx配置文件。这通常是/etc/nginx/nginx.conf或者/etc/nginx......
  • 后端跨域cookie问题与spring-session-data-redis
    背景1、后端统一接入了公司内部登录系统,登录后cookie信息在域名:test.net.cn下。Set-Cookie:SESSION=09a2f617-66a0-4e02-b99f-130d83900321;Domain=test.net.cn;Path=/;HttpOnly;SameSite=Lax2、当我们的系统接入到统一登录系统后,若访问域名为a.test.net.cn,则不会出现问题,因......
  • tui-image-editor中跨域问题
    如何安装tui-image-editor等就不再赘述,参考这篇博客即可,https://blog.csdn.net/weixin_44867717/article/details/128212251简单版参考:https://blog.csdn.net/Bonsoir777/article/details/134153807官网:https://ui.toast.com/tui-image-editor 下面说说我碰到的问题,跨域......
  • asp.net core 跨域
    missingalloworiginheaderasp.netcore在ASP.NETCore中,出现"missingalloworiginheader"错误通常是由于跨域资源共享(CORS)未正确配置所致。该错误的原因是客户端(如浏览器)尝试从不同的域或端口请求资源,而这些资源的访问被服务器限制。为了解决这个问题,你可以使......
  • vue3 多服务器域名跨域代理和请求配置
    多服务器域名的跨域配置:同样是在vue.config.js文件中对devServer.proxy进行配置,如下:const{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({transpileDependencies:true,lintOnSave:false,//关闭eslint检查,devServer:{......
  • 跨域
    当你的协议、域名、端口三者任一与当前url不一致的时候,就会出现跨域问题(浏览器的同源策略)1.Jsonp主要利用scrpt不用同源策略的影响,但是只支持get请求(目前非主流)2.CORS(主要依赖于后端)分为简单请求和非简单请求简单请求1.请求方式为GET、POST、HEAD;2.Content-Type为applicati......
  • Haproxy 安装配置
    Haproxy安装配置官方文档参考https://docs.haproxy.org/四层的haproxy不支持把客户端真实的IP地址传到后端服务器。1、安装1.1二进制编译安装。https://github.com/haproxy/haproxy/releases/tag/v2.8.0yumgroupinstall-y"DevelopmentTools"yuminstallpcrepcre-d......
  • GRPC - Deploying: Envoy proxy
    Installfunc-e: https://func-e.io/func-emakesrunningEnvoy®easyfunc-e(pronouncedfunky)allowsyoutoquicklyseeavailableversionsofEnvoyandtrythemout.Thismakesiteasytovalidateconfigurationyouwoulduseinproduction.Eachtimeyoue......
  • 抽丝剥茧:详述一次DevServer Proxy配置无效问题的细致排查过程
    事情的起因是这样的,在一个已上线的项目中,其中一个包含登录和获取菜单的接口因响应时间较长,后端让我尝试未经服务转发的另一域名下的新接口,旧接口允许跨域请求,但新接口不允许本地访问(只允许发布测试/生产的域名访问)。问题那么问题来了,本地环境该如何成功访问到新的接口并验证业务......
  • 6-HAProxy
    6.HAProxyhttps://my.oschina.net/gongfuxiang/blog/4545141部署HAProxy服务器配置网络,安装软件echo'net.ipv4.ip_forward=1'>>sysctl.conf  //开启路由转发sysctl-pyum-yinstallhaproxy修改配置文件vim/etc/haproxy/haproxy.cfg参数说明optionhttplog ......