|
"use strict"; |
|
|
|
/* |
|
|
|
Creates a HTTP proxy that rewrites Host: header to a predefined value |
|
Useful when forwarding requests to Apache or Nginx virtual hosts |
|
|
|
Usage: |
|
|
|
PORT_LISTEN=123 PORT_TARGET=456 HOST_TARGET=127.0.0.1 HOST_ORIGIN="tere.ee" node proxy.js |
|
|
|
Where |
|
|
|
* PORT_LISTEN is the port the proxy should be listening for incoming requests |
|
* PORT_TARGET is the port the target server is listening for |
|
* HOST_TARGET is the hostname or IP where the target server is listening on |
|
* HOST_ORIGIN is the value that is set for the Host: header |
|
|
|
*/ |
|
|
|
var http = require("http"), |
|
url = require("url"); |
|
|
|
var listenPort = process.env.PORT_LISTEN || 8080, |
|
targetPort = process.env.PORT_TARGET || 9000, |
|
targetHost = process.env.HOST_TARGET || "localhost", |
|
origin = process.env.HOST_ORIGIN || "origin"; |
|
|
|
var server = http.createServer(function(request, response){ |
|
var options, proxyRequest, user; |
|
|
|
request.headers.host = origin; |
|
request.headers['x-forwarded-for'] = request.headers['x-forwarded-for'] || request.connection.remoteAddress; |
|
|
|
options = url.parse("http://" + targetHost+(targetPort?":"+targetPort:"") + request.url); |
|
options.method = request.method; |
|
options.headers = request.headers; |
|
|
|
proxyRequest = http.request(options); |
|
|
|
proxyRequest.addListener("response", function (proxyResponse) { |
|
proxyResponse.pipe(response); |
|
response.writeHead(proxyResponse.statusCode, proxyResponse.headers); |
|
|
|
// Log requests to console |
|
console.log("%s [%s] \"%s %s\" %s", |
|
request.headers['x-forwarded-for'], |
|
new Date().toISOString().replace(/T/, " ").replace(/\.\d+Z/i, ""), |
|
request.method, |
|
request.url, |
|
proxyResponse.statusCode); |
|
}); |
|
|
|
request.pipe(proxyRequest); |
|
}); |
|
|
|
server.listen(listenPort, function(){ |
|
console.log("Proxy listening on port %s", listenPort); |
|
console.log("Forwarding requests to http://%s as %s", targetHost+(targetPort?":"+targetPort:""), origin); |
|
}); |
Fantastic, thank you for this! I've forked it to add handling rewriting the Location header on 3xx responses.