#javascript #node.js #reverse-proxy #http-proxy #node-http-proxy
#javascript #node.js #обратный прокси #http-прокси #узел-http-прокси
Вопрос:
Мой вопрос: является ли http-прокси, reverse-proxy.js или любая другая библиотека (за исключением веб-сервера, такого как nginx), способная направлять все запросы, поступающие на порт 80, в другие сервисы на основе URL?
Если на порт 80 поступает запрос с этим URL localhost:80/route1
я хочу перенаправить его на службу по адресу localhost:3001
Если на порт 80 поступает запрос с этим URL localhost:80/another-route
, я хочу перенаправить его на службу по адресу localhost:3002
. И так далее..
Подводя итог: я хочу предоставить 1 порт (80), а затем направить запрос другим сервисам на основе шаблона URL из запроса. До сих пор я пробовал этот подход ниже, используяreverse-proxy.js но это работает только в том случае, если порт изменяется
{
"port": 80,
"routes": {
"localhost/test": "localhost:3001",
"localhost/another-route": "localhost:3002",
"localhost/another-route-same-service": "localhost:3002",
"*": 80
}
}
Ответ №1:
Да, конечно, вы можете. Это очень распространенное требование. В Node вы можете сделать это изначально, используя потоки. Вот полный рабочий пример, использующий только стандартную http библиотеку узла.
const http = require('http');
const server = http.createServer();
let routes = {
'/test': {
hostname: 'portquiz.net',
port: 80
}
}
function proxy(req, res){
if (!routes[req.url]){
res.statusCode = 404;
res.end();
return;
}
let options = {
...routes[req.url],
path: '', // if you want to maintain the path use req.url
method: req.method,
headers: req.headers
}
let proxy = http.request(options, function(r){
res.writeHead(r.statusCode, r.headers);
r.pipe(res, { end: true });
})
req.pipe(proxy, { end: true }).on('error', err => console.log(err))
}
server.on('request', proxy);
server.listen(8080);