5

I want to configure proxy with http-proxy-middleware and express . The rule is a mapping of hostname, exmaple:

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

I have tried like this:

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

but it doesn't work.

1 Answer 1

9

There's a couple of things you need to consider:

  • The http-proxy-middleware module does not return a promise, instead it returns an express middleware.
  • You can use a custom filter to decide whether or not to proxy the request.
  • You need to add the pathRewrite options in order to rewrite the url according to the current hostname.
  • Another option would be to use the router option. See the relevant documentation.

I wrote a quick express app to test this (note that i overwrote my hosts file with localwebapp and localwebapp2 pointing to 127.0.0.1) and it seems to work fine:

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);
Sign up to request clarification or add additional context in comments.

1 Comment

how to change Referer header?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.