webpack 代理跨域

当我们做项目时,后台开发接口给我们,我们访问一般是跨域访问,那么如何使用 webpack 进行跨域访问,来完成前端测试的接口问题。

我们使用 node 开发后台接口,来模拟这个问题的答案。

const express = require("express");

const app = express();

app.get("/proxy",function(req,res,next){
    res.json({"name":"Condor Hero"});
});

app.listen(500);

console.log("500 端口已经成功监听!");

上面的代码使用 node 和 express 配合,来模拟了 http://127.0.0.1:500/proxy 这个接口。

访问结果:


现在的问题是 8080 得不到 500 的数据。要设置代理跨域,改变前端的webpack.config.js:

//webpack.config.js
// var path = require("path");
// 使用webpack-dev-server 就不需要path

module.exports = {
    mode:"development",
    entry:"./App/main.js",
    output:{
        // webpack要求的输出路径
        // path:path.resolve(__dirname,"dist"),
        // webpack-dev-server的虚拟输出路径虚拟生成,不损坏硬盘,效率很高,热更新
        publicPath:"virtual",
        filename:"all.js"
    },
    // webpack-dev-server 动态实时更新不在需要watch:true;
    // watch:true,
    module:{
        rules:[
            {
                test:/\.less$/,
                  use: [
                    {
                        loader: "style-loader"  // creates style nodes from JS strings
                    }, 
                    {
                        loader: "css-loader"        // translates CSS into CommonJS
                    }, 
                    {
                        loader: "less-loader"   // compiles Less to CSS
                    }
                    //上面的另一种写法
                    //use: ['style-loader', 'css-loader','less-loader']
                ]
            },
            {
                test: /\.m?js$/,//匹配.mjs和.js结束的文件
                exclude: /(node_modules|bower_components)/,
                use: {
                loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env','@babel/preset-react'],
                        // @babel/plugin-proposal-object-rest-spread翻译高级ES的...
                        // @babel/plugin-transform-runtime翻译高级ES的带星函数即Generator
                        plugins: ['@babel/plugin-proposal-object-rest-spread','@babel/plugin-transform-runtime']
                    }
                }
            }
        ]
    },
    resolve: {
        //自动解析确定的扩展。默认值为:
        extensions: [".js", ".json", ".jsx", ".css"],
        //解析目录时要使用的文件名。默认:
        mainFiles: ["index","Index"]
    },
    // 代理跨域
    devServer: {
        // 此处可以自定义访问端口号
        port : 8080,
        proxy: {
            '/api': {
                target: 'http://localhost:500',
                // pathRewrite 表示代理路径是否是 URL 的一部分
                // 默认不写 pathRewrite,/api 就是 URL 的一部分,开发环境和生产环境都不能去掉
                pathRewrite: {'^/api' : ''} // api 只在开发环境下有,不是 URL 的一部分
            }
        }
    }
}

webpack 官网配置地址 :https://webpack.js.org/configuration/dev-server/#devserverproxy

webpack-dev-server 的底层用的是 http-proxy-middleware (React 中用这个 package 也能跨域),http-proxy-middleware 底层用的是 http-proxy。

此时任何 500 的端口,都会被偷到 8080 端口来,但是要补一个 /api

以前:

http://127.0.0.1:500/proxy

现在:

http://127.0.0.1:8080/api/proxy

成功跨域。

上面是在本机上测试的,但请注意偷取别人的服务器时别忘了的改target

 target: 'http://localhost:500'变成别的电脑IP
 target: 'http://192.168.2.250',

这时我们在引入访问就可以直接/api/proxy

另外如果代理地址是 https 的,需要配置:

secure: false

如果代理的主机服务器是虚拟主机,请求接口可能会出现 404 状态码,此时需要改写主机头 origin:

changeOrigin: true

返回 404 的原因是:

如果后端服务托管在虚拟主机的时候,也就是一个IP对应多个域名,需要通过域名区分服务,那么参数changeOrigin必须为true(默认为false),这样才会传递给后端正确的Host头,虚拟主机才能正确回应。否则http-proxy-middleware会原封不动将本地HTTP请求发往后端,包括Host: localhost而不是Host: httpbin.org,只有正确的Host才能使用虚拟主机,不然会返回404 Not Found。
webpack 代理返回 404,changeOrigin的原理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容