#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. Я все еще хотел бы получить другой ответ, который был бы менее хакерским 😉