Search code examples
javascriptnode.jsproxynode-http-proxy

Node Http Proxy - basic reverse proxy doesn't work (404s)


I'm trying to get a very simple proxy working with node-http-proxy which I would expect to just return the contents of google:

const http = require('http');
const httpProxy = require('http-proxy');

const targetUrl = 'http://www.google.co.uk';

const proxy = httpProxy.createProxyServer({
    target: targetUrl
});

http.createServer(function (req, res) {

    proxy.web(req, res);

}).listen(6622);

For example I would expect http://localhost:6622/images/nav_logo242.png to proxy to http://www.google.co.uk/images/nav_logo242.png instead of returning a 404 not found.

Thanks.


Solution

  • You need to set the Host header of your request

    const http = require('http');
    const httpProxy = require('http-proxy');
    
    const targetHost = 'www.google.co.uk';
    
    const proxy = httpProxy.createProxyServer({
        target: 'http://' + targetHost
    });
    
    http.createServer(function (req, res) {
        proxy.web(req, res);
    
    }).listen(6622);
    
    proxy.on('proxyReq', function(proxyReq, req, res, options) {
        proxyReq.setHeader('Host', targetHost);
    });
    

    Inside an express app it's probably easier to use express-http-proxy when proxying some of the requests.

    const proxy = require('express-http-proxy');
    app.use('*', proxy('www.google.co.uk', {
      forwardPath: function(req, res) {
        return url.parse(req.originalUrl).path;
      }
    }));