Security News
GitHub Removes Malicious Pull Requests Targeting Open Source Repositories
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
http-proxy-middleware
Advanced tools
The one-liner node.js proxy middleware for connect, express and browser-sync
The http-proxy-middleware package is a Node.js package that provides an HTTP proxy as a middleware for use with Node.js applications, particularly in conjunction with frameworks like Express. It allows developers to easily set up proxy rules to forward requests to other servers, which is useful for tasks like API forwarding, logging, handling CORS, and more.
Proxy requests
This feature allows you to proxy requests to another server. In this example, all requests to '/api' on the local server are forwarded to 'http://www.example.org'.
const { createProxyMiddleware } = require('http-proxy-middleware');
const apiProxy = createProxyMiddleware('/api', { target: 'http://www.example.org' });
app.use('/api', apiProxy);
Path Rewriting
This feature allows you to rewrite the path of the request URL before it gets proxied. In this example, the path '/api' is removed before the request is forwarded to 'http://www.example.org'.
const { createProxyMiddleware } = require('http-proxy-middleware');
const apiProxy = createProxyMiddleware('/api', {
target: 'http://www.example.org',
pathRewrite: { '^/api': '' }
});
app.use('/api', apiProxy);
Custom Routing Logic
This feature allows you to implement custom routing logic. In this example, only GET requests to paths starting with '/api' are proxied to 'http://www.example.org'.
const { createProxyMiddleware } = require('http-proxy-middleware');
const apiProxy = createProxyMiddleware((pathname, req) => {
return pathname.match('^/api') && req.method === 'GET';
}, { target: 'http://www.example.org' });
app.use(apiProxy);
Handling WebSockets
This feature allows you to proxy WebSocket connections. In this example, WebSocket connections to '/socket' are proxied to 'ws://www.example.org'.
const { createProxyMiddleware } = require('http-proxy-middleware');
const wsProxy = createProxyMiddleware('/socket', {
target: 'ws://www.example.org',
ws: true
});
app.use('/socket', wsProxy);
express-http-proxy is similar to http-proxy-middleware but is specifically designed for use with Express. It offers similar features for proxying HTTP requests but may have different configuration options and middleware setup.
node-http-proxy is a full-featured HTTP proxy library for Node.js, which http-proxy-middleware is built upon. It provides more low-level control over proxying but requires more setup compared to the convenience middleware layer provided by http-proxy-middleware.
Redbird is a reverse proxy library for Node.js with built-in support for clustering, HTTP2, LetsEncrypt, and more. It is more feature-rich and suitable for more complex proxying needs compared to http-proxy-middleware, which is simpler and more focused on middleware use cases.
Node.js proxying made simple. Configure proxy middleware with ease for connect, express and browser-sync.
Powered by the popular Nodejitsu http-proxy
.
$ npm install --save-dev http-proxy-middleware
Configure the proxy middleware.
var proxyMiddleware = require('http-proxy-middleware');
var proxy = proxyMiddleware('/api', {target: 'http://www.example.org'});
// \____/ \________________________________/
// | |
// context options
// 'proxy' is now ready to be used in a server.
'/api'
or ['/api', '/ajax']
. (more about context matching)// shorthand syntax for the example above:
var proxy = proxyMiddleware('http://www.example.org/api');
More about the shorthand configuration.
An example with express server.
// include dependencies
var express = require('express');
var proxyMiddleware = require('http-proxy-middleware');
// configure proxy middleware context
var context = '/api'; // requests with this path will be proxied
// configure proxy middleware options
var options = {
target: 'http://www.example.org', // target host
changeOrigin: true, // needed for virtual hosted sites
ws: true, // proxy websockets
pathRewrite: {
'^/old/api' : '/new/api' // rewrite paths
},
proxyTable: {
// when request.headers.host == 'dev.localhost:3000',
// override target 'http://www.example.org' to 'http://localhost:8000'
'dev.localhost:3000' : 'http://localhost:8000'
}
};
// create the proxy
var proxy = proxyMiddleware(context, options);
// use the configured `proxy` in web server
var app = express();
app.use(proxy);
app.listen(3000);
Check out working examples.
Tip: For name-based virtual hosted sites, you'll need to use the option changeOrigin
and set it to true
.
http-proxy-middleware offers several ways to decide which requests should be proxied. Request URL's path-absolute and query will be used for context matching .
path matching
'/'
- matches any path, all requests will be proxied.'/api'
- matches paths starting with /api
multiple path matching
['/api', '/ajax', '/someotherpath']
wildcard path matching For fine-grained control you can use wildcard matching. Glob pattern matching is done by micromatch. Visit micromatch or glob for more globbing examples.
'**'
matches any path, all requests will be proxied.'**/*.html'
matches any path which ends with .html
'/*.html'
matches paths directly under path-absolute'/api/**/*.html'
matches requests ending with .html
in the path of /api
['/api/**', '/ajax/**']
combine multiple patterns['/api/**', '!**/bad.json']
exclusionUse the shorthand syntax when verbose configuration is not needed. The context
and option.target
will be automatically configured when shorthand is used. Options can still be used if needed.
proxyMiddleware('http://www.example.org:8000/api');
// proxyMiddleware('/api', {target: 'http://www.example.org:8000'});
proxyMiddleware('http://www.example.org:8000/api/books/*/**.json');
// proxyMiddleware('/api/books/*/**.json', {target: 'http://www.example.org:8000'});
proxyMiddleware('http://www.example.org:8000/api', {changeOrigin:true});
// proxyMiddleware('/api', {target: 'http://www.example.org:8000', changeOrigin: true});
// verbose api
proxyMiddleware('/', {target:'http://echo.websocket.org', ws:true});
// shorthand
proxyMiddleware('http://echo.websocket.org', {ws:true});
// shorter shorthand
proxyMiddleware('ws://echo.websocket.org');
In the previous WebSocket examples, http-proxy-middleware relies on a initial http request in order to listen to the http upgrade
event. If you need to proxy WebSockets without the initial http request, you can subscribe to the server's http upgrade
event manually.
var proxy = proxyMiddleware('ws://echo.websocket.org', {changeOrigin:true});
var app = express();
app.use(proxy);
var server = app.listen(3000);
server.on('upgrade', proxy.upgrade); // <-- subscribe to http 'upgrade'
option.pathRewrite: object, rewrite target's url path. Object-keys will be used as RegExp to match paths.
{
"^/old/api" : "/new/api", // rewrite path
"^/remove/api" : "" // remove path
}
option.proxyTable: object, re-target option.target
based on the request header host
parameter. host
can be used in conjunction with path
. Only one instance of the proxy will be used. The order of the configuration matters.
{
"integration.localhost:3000" : "http://localhost:8001", // host only
"staging.localhost:3000" : "http://localhost:8002", // host only
"localhost:3000/api" : "http://localhost:8003", // host + path
"/rest" : "http://localhost:8004" // path only
}
option.logLevel: string, ['debug', 'info', 'warn', 'error', 'silent']. Default: 'info'
option.logProvider: function, modify or replace log provider. Default: console
.
// simple replace
function logProvider(provider) {
// replace the default console log provider.
return require('winston');
}
// verbose replacement
function logProvider(provider) {
var logger = new (require('winston').Logger)();
var myCustomProvider = {
log: logger.log,
debug: logger.debug,
info: logger.info,
warn: logger.warn,
error: logger.error
}
return myCustomProvider;
}
option.onError: function, subscribe to http-proxy's error event for custom error handling.
function onError(err, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong. And we are reporting a custom error message.');
}
option.onProxyRes: function, subscribe to http-proxy's proxyRes event.
function onProxyRes(proxyRes, req, res) {
proxyRes.headers['x-added'] = 'foobar'; // add new header to response
delete proxyRes.headers['x-removed']; // remove header from response
}
option.onProxyReq: function, subscribe to http-proxy's proxyReq event.
function onProxyReq(proxyReq, req, res) {
// add custom header to request
proxyReq.setHeader('x-added', 'foobar');
// or log the req
}
(DEPRECATED) option.proxyHost: Use option.changeOrigin = true
instead.
The following options are provided by the underlying http-proxy.
path
(useful for proxying to proxies)Undocumented options are provided by the underlying http-proxy
{host:'www.example.org'}
) sourceView the recipes for common use cases.
To run and view the proxy examples, clone the http-proxy-middleware repo and install the dependencies:
$ git clone https://github.com/chimurai/http-proxy-middleware.git
$ cd http-proxy-middleware
$ npm install
Run the example:
$ node examples/connect
Or just explore the proxy examples' sources:
examples/connect
- connect proxy exampleexamples/express
- express proxy exampleexamples/browser-sync
- browser-sync proxy exampleexamples/websocket
- websocket proxy example with expresshttp-proxy-middleware is compatible with the following servers:
To run the test suite, first install the dependencies, then run:
# install dependencies
$ npm install
# unit tests
$ npm test
# code coverage
$ npm run cover
The MIT License (MIT)
Copyright (c) 2015 Steven Chim
FAQs
The one-liner node.js proxy middleware for connect, express, next.js and more
The npm package http-proxy-middleware receives a total of 9,886,410 weekly downloads. As such, http-proxy-middleware popularity was classified as popular.
We found that http-proxy-middleware demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
Security News
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Security News
Node.js will be enforcing stricter semver-major PR policies a month before major releases to enhance stability and ensure reliable release candidates.