Node.js proxying made simple. Configure proxy middleware with ease for connect, express, next.js and many more.
Powered by the popular Nodejitsu http-proxy.
This page is showing documentation for version v3.x.x (release notes)
See MIGRATION.md for details on how to migrate from v2.x.x to v3.x.x
If you're looking for older documentation. Go to:
Proxy /api requests to http://www.example.org
:bulb: Tip: Set the option changeOrigin to true for name-based virtual hosted sites.
// typescript import * as express from 'express'; import type { Request, Response, NextFunction } from 'express'; import { createProxyMiddleware } from 'http-proxy-middleware'; import type { Filter, Options, RequestHandler } from 'http-proxy-middleware'; const app = express(); const proxyMiddleware = createProxyMiddleware<Request, Response>({ target: 'http://www.example.org/api', changeOrigin: true, }), app.use('/api', proxyMiddleware); app.listen(3000); // proxy and keep the same base path "/api" // http://127.0.0.1:3000/api/foo/bar -> http://www.example.org/api/foo/bar
All http-proxy options can be used, along with some extra http-proxy-middleware options.
http-proxy eventshttp-proxy optionsnpm install --save-dev http-proxy-middleware
Create and configure a proxy middleware with: createProxyMiddleware(config).
const { createProxyMiddleware } = require('http-proxy-middleware'); const apiProxy = createProxyMiddleware({ target: 'http://www.example.org', changeOrigin: true, }); // 'apiProxy' is now ready to be used as middleware in a server.
options.target: target host to proxy to. (protocol + host)
options.changeOrigin: for virtual hosted sites
see full list of http-proxy-middleware configuration options
An example with express server.
// include dependencies const express = require('express'); const { createProxyMiddleware } = require('http-proxy-middleware'); const app = express(); // create the proxy /** @type {import('http-proxy-middleware/dist/types').RequestHandler<express.Request, express.Response>} */ const exampleProxy = createProxyMiddleware({ target: 'http://www.example.org/api', // target host with the same base path changeOrigin: true, // needed for virtual hosted sites }); // mount `exampleProxy` in web server app.use('/api', exampleProxy); app.listen(3000);
If you want to use the server's app.use path parameter to match requests.
Use pathFilter option to further include/exclude requests which you want to proxy.
app.use( createProxyMiddleware({ target: 'http://www.example.org/api', changeOrigin: true, pathFilter: '/api/proxy-only-this-path', }), );
app.use documentation:
http-proxy-middleware options:
pathFilter (string, []string, glob, []glob, function)Narrow down which requests should be proxied. The path used for filtering is the request.url pathname. In Express, this is the path relative to the mount-point of the proxy.
path matching
createProxyMiddleware({...}) - matches any path, all requests will be proxied when pathFilter is not configured.createProxyMiddleware({ pathFilter: '/api', ...}) - matches paths starting with /apimultiple path matching
createProxyMiddleware({ pathFilter: ['/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.
createProxyMiddleware({ pathFilter: '**', ...}) matches any path, all requests will be proxied.createProxyMiddleware({ pathFilter: '**/*.html', ...}) matches any path which ends with .htmlcreateProxyMiddleware({ pathFilter: '/*.html', ...}) matches paths directly under path-absolutecreateProxyMiddleware({ pathFilter: '/api/**/*.html', ...}) matches requests ending with .html in the path of /apicreateProxyMiddleware({ pathFilter: ['/api/**', '/ajax/**'], ...}) combine multiple patternscreateProxyMiddleware({ pathFilter: ['/api/**', '!**/bad.json'], ...}) exclusionNote: In multiple path matching, you cannot use string paths and wildcard paths together.
custom matching
For full control you can provide a custom function to determine which requests should be proxied or not.
/** * @return {Boolean} */ const pathFilter = function (path, req) { return path.match('^/api') && req.method === 'GET'; }; const apiProxy = createProxyMiddleware({ target: 'http://www.example.org', pathFilter: pathFilter, });
pathRewrite (object/function)Rewrite target's url path. Object-keys will be used as RegExp to match paths.
// rewrite path pathRewrite: {'^/old/api' : '/new/api'} // remove path pathRewrite: {'^/remove/api' : ''} // add base path pathRewrite: {'^/' : '/basepath/'} // custom rewriting pathRewrite: function (path, req) { return path.replace('/api', '/base/api') } // custom rewriting, returning Promise pathRewrite: async function (path, req) { const should_add_something = await httpRequestToDecideSomething(path); if (should_add_something) path += "something"; return path; }
router (object/function)Re-target option.target for specific requests.
// Use `host` and/or `path` to match requests. First match will be used. // The order of the configuration matters. router: { 'integration.localhost:3000' : 'http://127.0.0.1:8001', // host only 'staging.localhost:3000' : 'http://127.0.0.1:8002', // host only 'localhost:3000/api' : 'http://127.0.0.1:8003', // host + path '/rest' : 'http://127.0.0.1:8004' // path only } // Custom router function (string target) router: function(req) { return 'http://127.0.0.1:8004'; } // Custom router function (target object) router: function(req) { return { protocol: 'https:', // The : is required host: '127.0.0.1', port: 8004 }; } // Asynchronous router function which returns promise router: async function(req) { const url = await doSomeIO(); return url; }
plugins (Array)const simpleRequestLogger = (proxyServer, options) => { proxyServer.on('proxyReq', (proxyReq, req, res) => { console.log(`[HPM] [${req.method}] ${req.url}`); // outputs: [HPM] GET /users }); }, const config = { target: `http://example.org`, changeOrigin: true, plugins: [simpleRequestLogger], };
ejectPlugins (boolean) default: falseIf you're not satisfied with the pre-configured plugins, you can eject them by configuring ejectPlugins: true.
NOTE: register your own error handlers to prevent server from crashing.
// eject default plugins and manually add them back const { debugProxyErrorsPlugin, // subscribe to proxy errors to prevent server from crashing loggerPlugin, // log proxy events to a logger (ie. console) errorResponsePlugin, // return 5xx response on proxy error proxyEventsPlugin, // implements the "on:" option } = require('http-proxy-middleware'); createProxyMiddleware({ target: `http://example.org`, changeOrigin: true, ejectPlugins: true, plugins: [debugProxyErrorsPlugin, loggerPlugin, errorResponsePlugin, proxyEventsPlugin], });
logger (Object)Configure a logger to output information from http-proxy-middleware: ie. console, winston, pino, bunyan, log4js, etc...
Only info, warn, error are used internally for compatibility across different loggers.
If you use winston, make sure to enable interpolation: https://github.com/winstonjs/winston#string-interpolation
See also logger recipes (recipes/logger.md) for more details.
createProxyMiddleware({ logger: console, });
http-proxy eventsSubscribe to http-proxy events with the on option:
createProxyMiddleware({ target: 'http://www.example.org', on: { proxyReq: (proxyReq, req, res) => { /* handle proxyReq */ }, proxyRes: (proxyRes, req, res) => { /* handle proxyRes */ }, error: (err, req, res) => { /* handle error */ }, }, });
option.on.error: function, subscribe to http-proxy's error event for custom error handling.
function onError(err, req, res, target) { res.writeHead(500, { 'Content-Type': 'text/plain', }); res.end('Something went wrong. And we are reporting a custom error message.'); }
option.on.proxyRes: 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.on.proxyReq: 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 }
option.on.proxyReqWs: function, subscribe to http-proxy's proxyReqWs event.
function onProxyReqWs(proxyReq, req, socket, options, head) { // add custom header proxyReq.setHeader('X-Special-Proxy-Header', 'foobar'); }
option.on.open: function, subscribe to http-proxy's open event.
function onOpen(proxySocket) { // listen for messages coming FROM the target here proxySocket.on('data', hybridParseAndLogMessage); }
option.on.close: function, subscribe to http-proxy's close event.
function onClose(res, socket, head) { // view disconnected websocket connections console.log('Client disconnected'); }
http-proxy optionsThe following options are provided by the underlying http-proxy library.
option.target: url string to be parsed with the url module
option.forward: url string to be parsed with the url module
option.agent: object to be passed to http(s).request (see Node's https agent and http agent objects)
option.ssl: object to be passed to https.createServer()
option.ws: true/false: if you want to proxy websockets
option.xfwd: true/false, adds x-forward headers
option.secure: true/false, if you want to verify the SSL Certs
option.toProxy: true/false, passes the absolute URL as the path (useful for proxying to proxies)
option.prependPath: true/false, Default: true - specify whether you want to prepend the target's path to the proxy path
option.ignorePath: true/false, Default: false - specify whether you want to ignore the proxy path of the incoming request (note: you will have to append / manually if required).
option.localAddress : Local interface string to bind for outgoing connections
option.changeOrigin: true/false, Default: false - changes the origin of the host header to the target URL
option.preserveHeaderKeyCase: true/false, Default: false - specify whether you want to keep letter case of response header key
option.auth : Basic authentication i.e. 'user:password' to compute an Authorization header.
option.hostRewrite: rewrites the location hostname on (301/302/307/308) redirects.
option.autoRewrite: rewrites the location host/port on (301/302/307/308) redirects based on requested host/port. Default: false.
option.protocolRewrite: rewrites the location protocol on (301/302/307/308) redirects to 'http' or 'https'. Default: null.
option.cookieDomainRewrite: rewrites domain of set-cookie headers. Possible values:
false (default): disable cookie rewritingcookieDomainRewrite: "new.domain". To remove the domain, use cookieDomainRewrite: "".

AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。


选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


最强AI数据分析助手
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。


像人一样思考的AI智能体
imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。


AI数字人视频创作平台
Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号