解决 webpack 代理服务只能 localhost 访问

博客提及了package.json,虽未详细阐述,但它是项目配置重要文件。结合标签推测可能与webpack构建及IP相关配置有关,在项目开发中package.json可管理依赖和脚本等。
"dev": "cross-env NODE_ENV=development webpack-dev-server --inline --host 0.0.0.0 --hot"

package.json 

 

### Webpack代理配置详解 在开发环境中,Webpack Dev Server 提供了一个内置的HTTP服务器来托管静态资源并支持热更新等功能。当涉及到前后端分离的应用程序时,前端应用通常运行在一个本地服务上(比如`http://localhost:8080`),而后端API可能位于不同的域名或端口下(例如`http://localhost:3000/api`)。为了简化跨域请求处理,在这种情况下可以利用Webpack提供的代理功能。 #### 使用 `http-proxy-middleware` 通过引入第三方库`http-proxy-middleware`可以帮助更灵活地设置代理规则: ```javascript // webpack.config.js 或其他配置文件中 const { createProxyMiddleware } = require('http-proxy-middleware'); // 加载中间件包[^1] module.exports = { // ...其余配置项... devServer: { setupMiddlewares(middlewares, devServer) { if (!devServer) throw new Error('webpack-dev-server is not defined'); middlewares.push( createProxyMiddleware('/api', { target: 'http://localhost:3000', changeOrigin: true, pathRewrite: {'^/api' : ''} // 可选:重写路径去掉前缀 }) ); return middlewares; } }, }; ``` 这段代码展示了如何使用`createProxyMiddleware()`方法创建一个新的代理实例,并将其添加到现有的中间件列表里。这里指定了目标URL(`target`)以及一些额外选项如改变源地址(`changeOrigin`)和路径重写规则(`pathRewrite`)。 #### 配置简单的代理映射 如果只需要简单地将某些特定模式下的请求转发给另一个服务器,则可以直接在`devServer.proxy`属性内定义相应的匹配规则而无需借助外部模块: ```javascript module.exports = { // ... devServer: { proxy: { '/api': 'http://localhost:3000' } } } ``` 此方式适用于大多数场景,默认会把所有以`/api`开头的请求都发送至指定的目标地址。 #### 复杂条件判断与自定义逻辑 有时候还需要根据不同类型的请求采取不同策略,这时可以通过编写回调函数来自定义行为: ```javascript module.exports = { // ... devServer: { proxy: { '/api': { target: 'http://localhost:3000', bypass(req, res, proxyOptions){ const acceptHeader = req.headers.accept || ''; if(acceptHeader.includes('text/html')){ console.log('Bypassing proxy for HTML requests...'); return '/index.html'; } return undefined; // 继续执行默认代理操作 } } } } } ``` 上述例子说明了怎样基于请求头信息决定是否绕过当前代理设置返回某个固定页面;如果不满足条件则继续按照常规流程进行代理转发[^2]。 #### 关键字触发的特殊代理机制 另外一种情况可能是希望仅针对含有特定字符串的关键字发起的请求做特别处理,这同样可以在`bypass`钩子里面实现: ```javascript module.exports = { //... devServer: { proxy: [{ context: ['/getonenet'], // 定义要拦截的路径模式 target: 'https://example.com/', secure: false, logLevel: 'debug', onProxyReq(proxyReq, req, res){ if(req.url.startsWith('/getonenet')){ proxyReq.path = `/customPath${req.url}`; // 修改实际访问路径 } } }] } } ``` 在这个片段中,每当遇到带有`/getonenet`关键字的请求都会被送往预设的目标站点,并且还可以进一步修改这些请求的具体参数[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值