【问题标题】:Proxy target route to invalid url代理目标路由到无效 url
【发布时间】:2019-04-01 08:19:45
【问题描述】:

我正在尝试让 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 来实现?)

【问题讨论】:

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


    【解决方案1】:

    我得到了它的工作,但它是一个非常糟糕的黑客......但它工作......

    我添加了 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”添加到该 url(localhost:3000/test 变为 localhost:3000/a/test 等)

    【讨论】:

    • 我仍然希望得到另一个不那么老套的答案;)
    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2021-09-26
    • 2021-06-03
    • 2017-06-02
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多