Целевой маршрут прокси-сервера к недопустимому URL

#node.js #http-proxy #node-http-proxy #http-proxy-middleware

#node.js #http-прокси #узел-http-прокси #http-прокси-промежуточное программное обеспечение

Вопрос:

Я пытаюсь заставить работать http-прокси-промежуточное программное обеспечение, чего я пытаюсь добиться, так это запуска нескольких приложений 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?)

Ответ №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 и т.д.)

Комментарии:

1. Я все еще хотел бы получить другой ответ, который был бы менее хакерским 😉