代理目标路由到无效网址

时间:2019-04-01 08:19:45

标签: node.js http-proxy node-http-proxy http-proxy-middleware

我正在尝试使http-proxy-middleware正常工作,我要实现的目标是运行多个nodejs应用程序,然后将代理应用程序作为反向代理服务器。

我遇到的问题是当我按下代理应用程序上的链接时,这是我的代码:

var express = require('express')
var proxy = require('http-proxy-middleware')
var app = express()

var options = {
    target: 'http://localhost:1001', // target host
    changeOrigin: true, // needed for virtual hosted sites
    ws: false, // proxy websockets
    logLevel: "debug",
    pathRewrite: {
        '^/foo': '/', // rewrite path
    }
}
var exampleProxy = proxy(options)

app.use('/foo', exampleProxy)
app.listen(3000)

在localhost:1001应用程序上,我得到了路由'/'和'/ bar'

app.get('/', function (req, res) {
    res.render('home');
});

app.get('/bar', function (req, res) {
    res.render('bar');
});

如果我转到localhost:3000 / foo,它将重新路由到localhost:1001 /(同时在浏览器中显示localhost:3000 /),并与localhost:3000 / foo / bar相同。所以这很好。

当我进入localhost:3000 / foo然后按链接到'bar'时,会发生问题,然后它将把我路由到localhost:3000 / bar,这不是我在代理服务器中定义的路由。 / p>

所以我需要的是,当我按/ bar的链接时,它将路由到代理中的/ foo / bar。

我尝试了一些方法来解决此问题,但是(显然)没有成功:

将端口(1001)添加到响应(res.locals.portNo =“ 1001”),然后在请求中发送该端口,以便代理可以检查请求的来源,并添加/ foo(如果它是1001) )。 (我还没有尝试过,但是也许可以通过使用cookie来实现?)

1 个答案:

答案 0 :(得分:0)

我可以使用它,但是它是非常错误的入侵程序...但是可以使用...

我添加了cookie解析器

var cookieParser = require('cookie-parser')
app.use(cookieParser())

然后我添加了这个丑陋的中间件

app.use(function (req, res, next) {
    var domainLetter = req.cookies.domainLetter

    switch (req.url.substring(0, 2)) {
        case "/a": {
            domainLetter = 'a'
            res.cookie('domainLetter', 'a')
            break
        }
        case "/b": {
            domainLetter = 'b'
            res.cookie('domainLetter', 'b')
            break
        }
        default: {
            break
        }
    }

    if (req.url.length != 2 || req.url.substring(0, 2) != '/' + domainLetter)
        req.url = '/' + domainLetter + req.url
    next()
})

所以我正在做的是当我想为localhost:1001使用代理时,我转到localhost:3000 / a(或localhost:3000 / a / ****),然后它将保存一个cookie属性“ domainLetter”的值为“ a”,那么每当我单击该网站上的链接时,它将在该网址中添加“ / a”(localhost:3000 / test变为localhost:3000 / a / test等)