Webpack devServer.proxy反向代理地址模糊相似规则问题

在使用Webpack进行项目配置时,特别是在Vue、React等前端框架中,正确的反向代理设置至关重要。文章详细解析了在配置多个反向代理时,由于地址模糊相似导致的请求匹配错误,并提供了有效的解决方案。

我们在开发Vue、React等项目用Webpack进行项目配置的时候, 在开发模式下请求数据多少会涉及到它里面提供的devServe.proxy即Node.js的反向代理中间件。

Node.js代理很简单。轻松的配置代理服务器中间件连接,快递,浏览器同步以及更多。 正因为它简单使开发者容易忽略的一个小细节地址模糊相似

示例

例如项目中有两个反向代理如下:

A: http://192.168.1.100:80
B: http://192.168.1.135:80
复制代码

我们忽略端口,此时A、B分别代理不同的服务器 我们给代理地址添加一下这样的别名如下:

proxy: {
  '/api': {
    target: 'http://192.168.1.100:80', // A Server
    changeOrigin: true,
    pathRewrite: {'^/api': '/api'}
  },
  '/api135': {
    target: 'http://192.168.1.135:80', // B Server
    changeOrigin: true,
    pathRewrite: {'^/api135': '/api'}
  }
}
复制代码

/api 代理A服务器下的/api地址

/api135 代理B服务器下的/api地址

但是如果按此顺序添加,这里呢有个隐藏的命名规则的坑地址模糊相似

假设当我们访问/api135/abc时,也就是真实地址B服务器/api/abc。 此时Webpack 会优先匹配到 /api, 然后找到/api的代理配置 最终生成地址 A服务器/api135/abc。

这里可能会问为什么不是 地址/api/xxx呢?

此时Webpack只是对url pathname进行了正则开始匹配 即 /^/xxx/,然后用不改变开始别名进行查询/api 而是 /api135 首先了解一个特性js循环对象是按照编写顺序进行循环的。 所以上面先添加的/api 后有 /api135

简单演示一下这个过程

const pathname = "/api135/abc"; // 输入的地址
const alias = "/api" // 代理别名
const targetAndPath = " http://192.168.1.100:80/api" // 代理地址:服务器+路径
const reg = RegExp("^"+alias); // 如果通过
if (reg.test(pathname)) { // 通过
    return pathname.replace(RegExp("^" + alias), targetAndPath); // http://192.168.1.100:80/api135/abc
}
// 不通过 迭代下一个
复制代码

解决

要解决这个问题只能在项目中代理配置表按照命名的从大到小进行排序添写就可以了, 或者换一个跟所有匹配都不沾边的别名。如下:

proxy: {
  '/api135': {
      target: 'http://192.168.1.135:80', // B Server
      changeOrigin: true,
      pathRewrite: {'^/api135': '/api'}
  },
  '/api': {
      target: 'http://192.168.1.100:80', // A Server
      changeOrigin: true,
      pathRewrite: {'^/api': '/api'}
  }
}
复制代码

最后

如果到这里不太明白的话, 用webpack配置时候,大多数同学会用主流的Vue、React等框架。

这里我用Vue来举例子,其他框架大同小异,类似Vue的动态路由和静态路由的关系,/about/tom 和 /about/:name,要匹配静态路由往往需要添加在动态路由前面即可。

也就同理等于

/api135
/api:path
复制代码

*版权声明:本文为原创文章,未经允许不得转载。

### 如何配置 `devServer.proxy` 设置 #### 基本配置结构 在 Vue CLI 或 Webpack Dev Server 中,可以通过 `devServer.proxy` 来设置开发环境下的反向代理,从而解决前端与后端不同源的问题。基本配置如下: ```javascript module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:3000/', changeOrigin: true, ws: true, pathRewrite: {'^/api': ''} } } } }; ``` 此段代码展示了如何针对 `/api` 路径前缀的请求进行转发到指定的目标地址,并且开启了 WebSocket 支持以及路径重写的功能[^1]。 #### 多个 API 接口配置 当项目中有多个不同的 API 地址时,可以为每一个接口单独定义一条代理规则,在同一个 `proxy` 对象内添加更多的键值对来实现这一点: ```javascript module.exports = { devServer: { proxy: { "/zzz": { target: "http://example.com:8082", changeOrigin: true, ws: true, }, "/xxx": { target: "http://another-example.com:8083", changeOrigin: true, ws: true, } } } } ``` 这里分别设置了两个独立的服务作为 `/zzz` 和 `/xxx` 这两条路由下所有请求的目的地[^3]。 #### 使用环境变量动态配置 为了提高灵活性并适应不同的部署场景,还可以利用环境变量来自动生成这些代理配置项。下面是一个例子展示怎样基于 `.env.*` 文件里的自定义变量构建代理规则: ```javascript // vue.config.js const { VUE_APP_BASE_NAME, VUE_APP_BASE_URL } = process.env; module.exports = { devServer: { proxy: { [VUE_APP_BASE_NAME]: { target: VUE_APP_BASE_URL, changeOrigin: true, pathRewrite: {[`^${VUE_APP_BASE_NAME}`]: ''} } } } }; ``` 这种方式允许开发者根据不同阶段(如本地测试、预发布等)轻松切换实际使用的API服务器地址而无需修改源码文件本身[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值