解决跨域问题之配置代理

文章介绍了在Vue开发中遇到跨域问题时,如何通过修改vue.config.js中的devServer.proxy配置,使用代理服务器转发请求,避免跨域预检请求。详细解释了简单请求和复杂请求的区别,以及如何配置多个代理规则。

       对于开发者而言,客户端与服务端通讯时出现跨域问题是常见的事,跨域的典型特征就是一次点击两次请求,一次 options 预检请求,通过后再发一次实际的get 或 post 请求,这是因为客户端向服务端请求数据时发送的是复杂请求,所以要解决跨域问题,只需要将复杂请求变更为简单请求即可,这里多提一嘴复杂请求和简单请求的概念:

1、请求类型为GET、POST、HEAD三种;

2、请求头类型为Accept、Accept-Language、Content-Type、Content-Language四种;

3、Content-Type的值为text/plain、multipart/form-data、application/x-www-form-urlencoded三种。

       满足以上三条的请求即为简单请求,反之则为复杂请求。但是在实际项目开发中,第一条是容易满足的,一个项目使用 get 或者 post 请求类型基本就够用了;第二条较难满足,由于部分业务的需要可能会使用到各种业务头、自定义请求头等;第三条也很难满足,大部分项目都会使用 application/json 作为 Content-Type值。综上说明将复杂请求转变为简单请求是很难完成的。因此本文就解决跨域问题提供第二种方式:使用代理,配置好代理,不论是简单请求还是复杂请求都不会有options 的出现。

       打开前端 vue 工程,找到 vue.config.js 文件并打开,添加如下代码:

module.exports = {
    devServer: {
        port: 9000,
        proxy: {
            '/webapi/test': {
                target: 'http://12.5.78.222:8888,   //目标服务器地址
                changeOrigin: true,                 //是否跨域
                secure: false,                      //是否https接口
                pathRewrite: {                      //路径重写
                    '^/webapi/test': '/webapi'
                }
            }
        }
    }
}

       说明:上述配置的意思是:凡是路径以 /webapi/test 开头的请求都会将其本地服务器地址转向目标服务器地址(12.5.78.222:8888),另外由于对路径进行了重写,所以路径 /webapi/test 就变成了 /webapi,最终实现了

http://localhost:9000/webapi/test  ==>  http://12.5.78.222:8888/webapi

       当我们使用 postman 测试时,请求 url 输入 http://12.5.78.222:8888/webapi 是可以正常访问的;当我们在浏览器地址栏中输入http://localhost:9000/webapi/test 同样可以正常访问,原因就是添加了上述代码使得客户端做了代理。还有一点需要注意,如果要配置多个代理,是可以在 proxy中添加多个的,但有顺序要求:

module.exports= {
    devServer: {
        port: 9000,
        proxy: {
            '/webapi/test1': {
                target: 'http://12.5.78.222:8888,    //目标服务器地址
                changeOrigin: true,                  //是否跨域
                secure: false,                       //是否https接口
                pathRewrite: {                       //路径重写
                    '^/webapi/test1': '/webapi/one'
                }
            },
            '/webapi/test2': {
                target: 'http://12.5.78.222:8888,    //目标服务器地址
                changeOrigin: true,                  //是否跨域
                secure: false,                       //是否https接口
                pathRewrite: {                       //路径重写
                    '^/webapi/test': '/webapi/two'
                }
            },
            '/webapi': {
                target: 'http://12.5.78.222:8888,    //目标服务器地址
                changeOrigin: true,                  //是否跨域
                secure: false,                       //是否https接口
                pathRewrite: {                       //路径重写
                    '^/webapi': '/webapi'
                }
            }
        }
    }
}

       上述配置的顺序是正确的,/webapi 因为涵盖了 /webapi/test1和/webapi/test2,所以如果 /webapi 放在最前面那么 /webapi/test1 和 /webapi/test2 就永远不会匹配到,拿个 if-else 举个例子就容易明白了:

if(path.startsWith('/webapi')) {
    function1(){}
}else if(path.startsWith('/webapi/test1')) {
    function2(){}
}else if(path.startsWith('/webapi/test2')) {
    function3(){}
}

        startWith 是字符串开头匹配方法,如果 path 是以 /webapi 开头,不管 /webapi 后面接的是什么内容,都会进第一个 if 而不会进 else if。

<think>好的,我现在需要帮助用户了解如何在前端配置代理解决问题。首先,我得回忆一下问题的基本概念,确保自己理解正确。是因为浏览器的同源策略,阻止不同源之间的资源交互,这会影响开发时的前后端联调。 接下来,用户问的是前端配置代理的方法,所以应该集中在前端解决的方案,尤其是开发服务器代理。常用的工具比如webpack-dev-server、vite、vue-cli或者create-react-app这些脚手架工具,它们都提供了代理配置选项。 然后,我需要分步骤说明如何配置。比如,在webpack中,可以通过devServer的proxy设置;在vite中是使用server.proxy。需要举例说明,比如设置目标地址、路径重写等。同时,要提到开发环境和生产环境的区别,因为生产环境通常需要后端配置CORS或者nginx反向代理,而前端代理主要用于开发阶段。 另外,可能需要解释一下代理的原理,即前端服务器接收请求,转发到后端,因为服务器之间没有同源限制。这样浏览器看到的是同源的请求,就不会触发错误。 还要注意常见的配置参数,比如target、changeOrigin、pathRewrite的作用,以及如何处理多个接口的不同路径。比如,可能有多个后端服务,需要配置不同的路径前缀。 有没有可能用户会遇到的问题?比如配置后仍然出现,这时候可能需要检查代理配置是否正确,请求的路径是否匹配,或者是否需要设置changeOrigin为true来修改请求头中的host。 另外,是否需要补充其他前端解决的方法,比如JSONP或者CORS,但指出这些方法可能需要后端配合,而代理是纯前端解决方案,仅限于开发环境使用。 最后,总结一下步骤,确保用户能清晰跟随操作,同时提醒生产环境的正确处理方式。可能还需要给出具体框架的配置示例,比如React或Vue项目中的具体配置文件位置和码片段。 现在需要将这些思路组织成结构化的回答,分点说明,确保语言简洁明了,适合不同层次的理解。同时,要使用中文,避免技术术语过于晦涩,必要时进行解释。</think>前端配置代理解决问题的实现步骤如下(以开发环境为例): 一、问题背景 浏览器同源策略会阻止以下请求: - 不同名(如 `localhost:3000` → `api.example.com`) - 不同端口(如 `localhost:3000` → `localhost:8080`) - 不同协议(如 `http://` → `https://`) 二、代理原理 通过前端开发服务器中转请求: ``` 浏览器 → 前端服务器(同源) → 转发请求 → 目标服务器 ``` 三、具体配置方法 1. Webpack项目(React/Vue等) 在 `vue.config.js` 或 `webpack.config.js` 中添加: ```javascript module.exports = { devServer: { proxy: { '/api': { target: 'http://target-server.com', // 目标地址 changeOrigin: true, // 修改请求头Host值 pathRewrite: { '^/api': '' // 路径重写(可选) } } } } } ``` 2. Vite项目 在 `vite.config.js` 中配置: ```javascript export default defineConfig({ server: { proxy: { '/api': { target: 'http://localhost:8080', rewrite: path => path.replace(/^\/api/, '') } } } }) ``` 3. Create-React-App项目 在 `package.json` 中添加: ```json "proxy": "http://target-server.com" ``` 或通过 `setupProxy.js` 文件: ```javascript const { createProxyMiddleware } = require('http-proxy-middleware'); module.exports = function(app) { app.use( '/api', createProxyMiddleware({ target: 'http://localhost:5000', changeOrigin: true, }) ); }; ``` 四、使用示例 前端请求: ```javascript axios.get('/api/user') // 本地路径 ``` 实际转发: ``` http://localhost:3000/api/user → http://target-server.com/user ``` 五、注意事项 1. 仅适用于开发环境(npm run dev) 2. 生产环境需通过以下方式解决: - 后端配置CORS头(Access-Control-Allow-Origin) - Nginx反向代理配置 - 前后端同部署 3. 复杂接口可配置多个代理规则: ```javascript proxy: { '/api1': { ... }, '/api2': { ... } } ``` 六、调试技巧 1. 查看Chrome开发者工具Network面板: - 检查请求是否显示为304(代理成功) - 确认实际请求URL正确 2. 服务端重启后需重新运行代理 3. 路径匹配支持通配符: ```javascript '/api/*': { ... } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【金融科技蚂蚁】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值