反向代理使用背景:
vue项目,前端代码在浏览器里面运行,由于浏览器的同源策略,不能直接发送跨域请求,导致请求发生跨域问题,错误如下图。
跨域的解决方案:
- jsonp(前端解决方案)
- 反向代理(前端解决方案)
- CORS(后端解决方案):cross orign resource sharing
什么是反向代理
反向代理(Reverse Proxy),以代理服务器来接收 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将请从服务器上得到的结果返回给 internet 上请求的客户端,此时代理服务器对外表现为一个服务器。
反向代理配置
下面以 vue-cli3 为例,vue-cli版本不同,配置不方法不同,详情可点击这里。
项目根目录新建 vue.config.js 文件,并将如下代码放入文件中。
// 修改和配置后必须重启服务器后才能生效
module.exports = {
lintOnSave: false, // 配置关闭eslint (代码会有红色热浪提示错 但不影响代码运行)
publicPath: './', // 打包路径,使用相对路径生成的dist文件夹下的index可以打开
outputDir: 'dist', // 输入文件目录
productionSourceMap: true, // 取消生成 map 文件
devServer: {
disableHostCheck: true, // 开启可以用自己的域名
https: false, // 是否使用https协议
hotOnly: false, // 是否开启热更新
open: true, // 开启跨域
proxy: { // 代理服务器,一个proxy下可以配置多个代理。
'/myapi': {
target: 'http://192.168.3.239:8082', // 代理地址,http://192.168.3.30:8082
changeOrigin: true, // 是否开启代理
ws: false, //是否要代理 websocket
//pathRewrite对请求路径进行重定向以匹配到正确的请求地址
// 假设页面路由配置 /site/login?token=&fnjdfjb&12addaj
// 本地请求地址为 http://localhos:8080/site/login?token=&fnjdfjb&12addaj
// 解析后的地址为 http://192.168.3.239:8082/login?token=&fnjdfjb&12addaj
// 重写路径 需要设置重写的话,要在后面的调用接口前加上/api 来代替target
pathRewrite: {
'^/site': '', //路由里的地址匹配 : 替换后的地址
// '^/upload': '/upload' //(如果路由有公共部分 例如 /upload/xx/xx类型的,那代理就需要这么写或者直接不写pathRewrite这部分)
}
}
}
}
};
注意事项:配置或修改了proxy代理内容后一定要重启项目!!!,否则无效或者报错404.还有就是不要出现’/api’ 和’/api2’这样相似的,这样只会生效一个!!!