【问题标题】:http-proxy-middleware does not forward the full pathhttp-proxy-middleware 不转发完整路径
【发布时间】:2016-09-20 14:52:37
【问题描述】:

我正在尝试将 BrowserSync 配置为在服务器模式下工作,并将我的 API 请求代理到在不同端口上运行在同一台机器上的后端,使用 http-proxy-middleware。我使用 Gulp 启动 BrowserSync。

BrowserSync 在 8081 端口上运行。我的后端在 8080 上运行。

这是我创建代理中间件的方法:

var proxyApi = proxy('/api', {target : 'http://localhost:8080/api', logLevel : 'debug'});

下面是我从 Gulp 任务中运行 BrowserSync 的方式:

// Init BrowserSync with proxies as middleware and based on the dest dir
browserSync.init({
    open: true,
    port: config.proxyPort,
    server: {
        baseDir: config.destDir,
        middleware: [proxyApi]
    },
    browser: "google chrome"
});

输出:

[HPM] Proxy created: /api  ->  http://localhost:8080/api

一切看起来都不错。

但是当我击中例如http://localhost:8081/api/users,输出为:

[HPM] GET /api/users/123 -> http://localhost:8080/api

...我的客户端收到 404 错误,因为 /api 本身与后端的任何内容都不匹配。

根据我从文档和示例中了解到,目标实际上应该是http://localhost:8080/api/users/123

为什么路径的其余部分(在本例中为 /users/123)被忽略了?

使用以下版本:

"gulp": "3.9.1",
"browser-sync": "2.16.0",
"http-proxy-middleware": "0.17.1",

【问题讨论】:

    标签: javascript node.js proxy http-proxy browser-sync


    【解决方案1】:

    prependPath 选项默认为true。此选项由底层库提供:http-proxy

    prependPath:true/false,默认值:true - 指定是否要 将目标路径添加到代理路径

    有两种方法可以解决此问题:

    1.) 将您的 target'http://localhost:8080/api' 更改为 'http://localhost:8080'

    var proxyApi = proxy('/api', {target: 'http://localhost:8080', logLevel: 'debug'});
    

    2.) 或者,您可以将选项 prependPath 设置为 false

    var proxyApi = proxy('/api', {target: 'http://localhost:8080/api', prependPath: false, logLevel: 'debug'});
    

    【讨论】:

    • 感谢您的指点和解决方案。第二个对我来说效果很好,因为我只想代理某些路由而不是整个服务器。我必须说prependPath 参数的名称对于它的作用不是很直观。
    • 除了配置不同外,选项1和2之间没有真正的区别。第一个参数'/api' 是确保只有那些请求被代理。想不出为什么要保留 target+path: http://localhost:8080/api 和额外的 prependPath 选项,如果它违反直觉的话。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2020-03-26
    • 2017-03-05
    • 2017-12-08
    • 2021-03-31
    • 2021-04-08
    • 2020-02-14
    相关资源
    最近更新 更多