如何在nodejs中为多个目标设置反向代理

How to set up a reverse proxy in nodejs for multiple targets?

本文关键字:设置 目标 代理 nodejs      更新时间:2023-09-26

我使用nodejs, expressjs和request来创建反向代理。

我想要的是,当一个请求被发送到http://localhost:PORT/NAME/对应的页面被加载。

例如,输入http://localhost:1234/google/谷歌网站将被加载如果我进入http://localhost:1234/stack/将会加载stackoverflow页面。

我尝试了类似于这里的代码

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);