到不同服务的单一端口路由
Single port route to different services
我的问题是:http-proxy, 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
}
}
当然可以。这是一个非常普遍的要求。在 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);
我的问题是:http-proxy, 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
}
}
当然可以。这是一个非常普遍的要求。在 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);