как установить прокси по запросу hostname с http-proxy-middleware и express? - PullRequest
1 голос
/ 26 марта 2019

Я хочу настроить прокси с 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');

но это не работает.

1 Ответ

2 голосов
/ 26 марта 2019

Есть пара вещей, которые нужно учитывать:

  • Модуль http-proxy-middleware не возвращает обещание, вместо этого возвращает экспресс-промежуточное ПО.
  • Вы можете использовать пользовательский фильтр, чтобы решить, следует ли использовать прокси
  • Вам необходимо добавить опции pathRewrite, чтобы переписать URL в соответствии с текущим именем хоста.

Я написал приложение для быстрой экспресс-проверки, чтобы проверить это (обратите внимание, что я переписал файл hosts с localwebapp и localwebapp2, указывающими на 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);
...