【问题标题】:how to set proxy by request hostname with http-proxy-middleware and express?如何通过请求主机名和 http-proxy-middleware 设置代理并表达?
【发布时间】:2019-08-16 18:28:40
【问题描述】:

我想用 http-proxy-middleware 和 express 配置代理。 规则是主机名的映射,例如:

http://123.com   >>  http://localhost:3000/123
http://456.com   >>  http://localhost:3000/abc

我试过这样:

import express from 'express';
import http from 'http';
import proxy from 'http-proxy-middleware';

const app = express();

app.use( async function (req, res) {  
  let direction = 'http://localhost:3000';
  console.log('hostname: ', req.hostname);
  console.log('originalUrl: ', req.originalUrl);
  if (req.hostname == '123.com') {
    direction = `http://localhost:3000/123${req.originalUrl}`;
  }
  if (req.hostname == '456.com') {
    direction = `http://localhost:3000/abc${req.originalUrl}`;
  }

  return await proxy({ target: direction, changeOrigin: false })
});

const server = http.createServer(app);
app.set('port', '127.0.0.1');
server.listen(9999, '0.0.0.0');

但它不起作用。

【问题讨论】:

    标签: node.js http-proxy http-proxy-middleware


    【解决方案1】:

    您需要考虑以下几点:

    • http-proxy-middleware 模块不返回承诺,而是 它返回一个快速中间件。
    • 您可以使用自定义过滤器来决定是否代理请求。
    • 您需要添加 pathRewrite 选项,以便根据当前主机名重写 url。
    • 另一个选项是使用路由器选项。请参阅relevant documentation

    我写了一个快速的应用程序来测试这个(注意我用localwebapplocalwebapp2 覆盖了我的主机文件指向127.0.0.1),它似乎工作正常:

    const express = require('express')
    const proxy = require('http-proxy-middleware')
    
    const app = express();
    const filter = (pathname, req) => {
        if (req.hostname == 'localwebapp' || req.hostname == 'localwebapp2') {
            return true;
        }
        return false;
    };
    
    app.get('/123*', (req, res) => {
        res.send(`matched 123* route: ${req.path}`);
    })
    
    app.get('/abc*', (req, res) => {
        res.send(`matched abc* route: ${req.path}`);
    })
    
    app.get('/test', (req, res) => {
        res.send("matched non proxied route '/test'");
    })
    
    const apiProxy = proxy(filter, {
        target: 'http://localhost:3000',
        logLevel: 'debug',
        changeOrigin: true,
        pathRewrite: function (path, req) {
            if (req.hostname == 'localwebapp') {
                return `/123${req.originalUrl}`;
            }
            if (req.hostname == 'localwebapp2') {
                return `/abc${req.originalUrl}`;
            }
            return path;
        }
    })
    app.use(apiProxy)
    app.listen(3000);
    

    【讨论】:

    • 如何更改Referer标头?
    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 2022-12-17
    • 1970-01-01
    • 2023-03-26
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    相关资源
    最近更新 更多