0

我试图让 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,这不是我在代理服务器中定义的路由。

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

我试图想出一些方法来解决这个问题,但(显然)没有成功:

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

4

1 回答 1

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 等)

于 2019-04-05T15:59:53.337 回答