Webpack devServer.proxy反向代理地址模糊相似规则问题
我们在开发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
*版权声明:本文为原创文章,未经允许不得转载。
转载自:https://juejin.cn/post/6844903715564945416