如何在nodejs中为多个目标设置反向代理?
How to set up a reverse proxy in nodejs for multiple targets?
我正在使用 nodejs、expressjs 并请求创建反向代理。
我想要的是当请求发送到
http://localhost:PORT/NAME/
相应页面已加载。
例如,如果我输入
http://localhost:1234/google/
google 网站将被加载
如果我进入
http://localhost:1234/stack/
将改为加载 Whosebug 页面。
我尝试了与此处类似的代码
var request = require('request');
app.get('/google', function(req,res) {
//modify the url in any way you want
var newurl = 'http://google.com/';
request(newurl).pipe(res);
});
问题是,它会加载页面,但不会完全加载,因为页面本身想要加载图像和 css 以及其他内容并发出 /images/example.jpg 之类的请求
那些显然以 404 错误结尾。
有没有人可以解决这个问题?
特别是因为简单地为 /images 设置路由是不好的,因为我有两个可能的目标服务器,代理不知道哪个是正确的。
首先,这是一个正向代理,其次,这是您想要的工作代码,请随意修改
从 http://127.0.0.1:5432/yahoo.com
中调用
var request = require('request');
var express = require('express')();
var session = require('cookie-session');
express.set('trust proxy', 1)
express.use(session({
keys: ['key1', 'key2']
}))
express.use(function(req,res,next)
{
if(req.url.indexOf('.com') < 0)
{
request('http://'+req.session.domain+'/'+req.params.site,function(err,response,body)
{
if(err)
res.status(500).send(err);
else
res.send(body);
});
}
else
next();
});
express.get('/:site',function(req,res)
{
request('http://'+req.params.site,function(err,response,body)
{
req.session.domain = req.params.site;
if(err)
res.status(500).send(err);
else
res.send(body);
});
});
express.listen(5432);
我正在使用 nodejs、expressjs 并请求创建反向代理。
我想要的是当请求发送到 http://localhost:PORT/NAME/ 相应页面已加载。
例如,如果我输入 http://localhost:1234/google/ google 网站将被加载 如果我进入 http://localhost:1234/stack/ 将改为加载 Whosebug 页面。
我尝试了与此处类似的代码
var request = require('request');
app.get('/google', function(req,res) {
//modify the url in any way you want
var newurl = 'http://google.com/';
request(newurl).pipe(res);
});
问题是,它会加载页面,但不会完全加载,因为页面本身想要加载图像和 css 以及其他内容并发出 /images/example.jpg 之类的请求 那些显然以 404 错误结尾。
有没有人可以解决这个问题? 特别是因为简单地为 /images 设置路由是不好的,因为我有两个可能的目标服务器,代理不知道哪个是正确的。
首先,这是一个正向代理,其次,这是您想要的工作代码,请随意修改
从 http://127.0.0.1:5432/yahoo.com
var request = require('request');
var express = require('express')();
var session = require('cookie-session');
express.set('trust proxy', 1)
express.use(session({
keys: ['key1', 'key2']
}))
express.use(function(req,res,next)
{
if(req.url.indexOf('.com') < 0)
{
request('http://'+req.session.domain+'/'+req.params.site,function(err,response,body)
{
if(err)
res.status(500).send(err);
else
res.send(body);
});
}
else
next();
});
express.get('/:site',function(req,res)
{
request('http://'+req.params.site,function(err,response,body)
{
req.session.domain = req.params.site;
if(err)
res.status(500).send(err);
else
res.send(body);
});
});
express.listen(5432);