chimurai/http-proxy-middleware

Được TopGit lập chỉ mục từ metadata GitHub: chimurai/http-proxy-middleware có 11.1k sao, viết chủ yếu bằng TypeScript. :zap: The one-liner node.js http-proxy middleware for connect, express, next.js and more
Tóm tắt dựng từ metadata GitHub của chính dự án — chưa có bài review TopGit. Trang sẽ tự động cập nhật khi bài review đầy đủ được xuất bản.
TopGit viết bài đầy đủ cho repo có nhiều sao nhất và được yêu cầu nhiều nhất. Trang này là snapshot trong thời gian chờ — xem README gốc ở tab READ ME.
Snapshot
Cộng tác viên hàng đầu
Xem cộng tác viên hàng đầu
http-proxy-middleware
Node.js proxying made simple. Configure proxy middleware with ease for connect, express, next.js, hono and many more.
Powered by httpxy. A maintained version of http-proxy.
⚠️ Note
This page is showing documentation for version v4.x.x (release notes)
For older documentation:
- v3.0.5
- v2.0.4
- v0.21.0
TL;DR
Proxy /api requests to http://www.example.org
:bulb: Tip: Set the option changeOrigin to true for name-based virtual hosted sites.
// typescript
import express from 'express';
import type { NextFunction, Request, Response } 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 httpxy options can be used, along with some extra http-proxy-middleware options.
Table of Contents
- Install
- Basic usage
- Express Server Example
- app.use(path, proxy)
- Options
pathFilter(string, []string, glob, []glob, function)pathRewrite(object/function)router(object/function)plugins(Array)ejectPlugins(boolean) default:false
definePluginhelperlogger(Object)
httpxyeventshttpxyoptions- WebSocket
- External WebSocket upgrade
- Intercept and manipulate requests
- Intercept and manipulate responses
- Node.js 17+: ECONNREFUSED issue with IPv6 and localhost (#705)
- Debugging
- Working examples
- Recipes
- Compatible servers
- Tests
- Changelog
- License
Install
npm install --save-dev http-proxy-middleware
Basic usage
Create and configure a proxy middleware with: createProxyMiddleware(config).
import { createProxyMiddleware } from '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-middlewareconfiguration options
Express Server Example
An example with express server.
// include dependencies
import express from 'express';
import { createProxyMiddleware } from 'http-proxy-middleware';
const app = express();
// create the proxy
/** @type {import('http-proxy-middleware').RequestHandler<import('express').Request, import('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);
app.use(path, proxy)
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:
- express: http://expressjs.com/en/4x/api.html#app.use
- connect: https://github.com/senchalabs/connect#mount-middleware
- polka: https://github.com/lukeed/polka#usebase-fn
Options
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 whenpathFilteris not configured.createProxyMiddleware({ pathFilter: '/api', ...})- matches paths starting with/api
-
multiple 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.htmlin the path of/apicreateProxyMiddleware({ pathFilter: ['/api/**', '/ajax/**'], ...})combine multiple patternscreateProxyMiddleware({ pathFilter: ['/api/**', '!**/bad.json'], ...})exclusion
Note: 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, res, options) { return path.replace('/api', '/base/api') }
// custom rewriting, returning Promise
pathRewrite: async function (path, req, res, options) {
const should_add_something = await httpRequestToDecideSomething(path);
if (should_add_something) path += "something";
return path;
}
// `res` is undefined in WebSocket upgrade flows.
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, res, options) {
return 'http://127.0.0.1:8004';
}
// Custom router function (target object)
router: function(req, res, options) {
return {
protocol: 'https:', // The : is required
host: '127.0.0.1',
port: 8004
};
}
// Asynchronous router function which returns promise
router: async function(req, res, options) {
const url = await doSomeIO();
return url;
}
// NOTE: `res` is undefined in WebSocket upgrade flows.
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: false
If 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
import {
debugProxyErrorsPlugin, // subscribe to proxy errors to prevent server from crashing
errorResponsePlugin, // return 5xx response on proxy error
loggerPlugin, // log proxy events to a logger (ie. console)
proxyEventsPlugin, // implements the "on:" option
} from 'http-proxy-middleware';
createProxyMiddleware({
target: `http://example.org`,
changeOrigin: true,
ejectPlugins: true,
plugins: [debugProxyErrorsPlugin, loggerPlugin, errorResponsePlugin, proxyEventsPlugin],
});
definePlugin helper
Create your own http-proxy-middleware plugin.
(Default plugins are created with definePlugin)
import { createProxyMiddleware, definePlugin } from 'http-proxy-middleware';
const myPlugin = definePlugin((proxyServer, options) => {
// plugin implementation
});
// use configure and use plugin
createProxyMiddleware({
target: `http://example.org`,
plugins: [myPlugin],
});
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,
});
httpxy events
Subscribe to httpxy 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 httpxy's
errorevent 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 httpxy's
proxyResevent.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 httpxy's
proxyReqevent.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 httpxy's
proxyReqWsevent.function onProxyReqWs(proxyReq, req, socket, options, head) { // add custom header proxyReq.setHeader('X-Special-Proxy-Header', 'foobar'); } -
option.on.open: function, subscribe to httpxy's
openevent.function onOpen(proxySocket) { // listen for messages coming FROM the target here proxySocket.on('data', hybridParseAndLogMessage); } -
option.on.close: function, subscribe to httpxy's
closeevent.function onClose(res, socket, head) { // view disconnected websocket connections console.log('Client disconnected'); }
httpxy options
The following options are provided by the underlying httpxy 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-cookieheaders. Possible values:-
false(default): disable cookie rewriting -
String: new domain, for example
cookieDomainRewrite: "new.domain". To remove the domain, usecookieDomainRewrite: "". -
Object: mapping of domains to new domains, use
"*"to match all domains.
For example keep one domain unchanged, rewrite one domain and remove other domains:cookieDomainRewrite: { "unchanged.domain": "unchanged.domain", "old.domain": "new.domain", "*": "" }
-
-
option.cookiePathRewrite: rewrites path of
set-cookieheaders. Possible values:-
false(default): disable cookie rewriting -
String: new path, for example
cookiePathRewrite: "/newPath/". To remove the path, usecookiePathRewrite: "". To set path to root usecookiePathRewrite: "/". -
Object: mapping of paths to new paths, use
"*"to match all paths. For example, to keep one path unchanged, rewrite one path and remove other paths:cookiePathRewrite: { "/unchanged.path/": "/unchanged.path/", "/old.path/": "/new.path/", "*": "" }
-
-
option.headers: object, adds request headers. (Example:
{host:'www.example.org'}) -
option.proxyTimeout: timeout (in millis) when proxy receives no response from target
-
option.timeout: timeout (in millis) for incoming requests
-
option.followRedirects: true/false, Default: false - specify whether you want to follow redirects
-
option.selfHandleResponse true/false, if set to true, none of the webOutgoing passes are called and it's your responsibility to appropriately return the response by listening and acting on the
proxyResevent -
option.buffer: stream of data to send as the request body. Maybe you have some middleware that consumes the request stream before proxying it on e.g. If you read the body of a request into a field called 'req.rawbody' you could restream this field in the buffer option:
import { createProxyServer } from 'httpxy'; import streamify from 'stream-array'; const proxy = createProxyServer(); export default function proxyWithBody(req, res, next) { proxy.web( req, res, { target: 'http://127.0.0.1:4003/', buffer: streamify(req.rawBody), }, next, ); }
WebSocket
See recipes/websocket.md for more examples.
// verbose api
createProxyMiddleware({ pathFilter: '/', target: 'http://echo.websocket.org', ws: true });
External WebSocket upgrade
In the previous WebSocket examples, http-proxy-middleware relies on an 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.
When the same middleware instance is attached to multiple servers and ws: true is used, each server needs its own initial HTTP request before upgrades are auto-subscribed.
const wsProxy = createProxyMiddleware({ target: 'ws://echo.websocket.org', changeOrigin: true });
const app = express();
app.use(wsProxy);
const server = app.listen(3000);
server.on('upgrade', wsProxy.upgrade); // <-- subscribe to http 'upgrade'
Intercept and manipulate requests
Intercept requests from downstream by defining on.proxyReq in createProxyMiddleware.
Fix POST request:
Use the pre-provided request interceptor fixRequestBody to fix proxied POST requests when bodyParser is applied before this middleware.
import { createProxyMiddleware, fixRequestBody } from 'http-proxy-middleware';
const proxy = createProxyMiddleware({
on: {
// Fix POST request when `bodyParser` is used
proxyReq: fixRequestBody,
},
});
Modify POST request:
import bodyParser from 'body-parser';
import { createProxyMiddleware, fixRequestBody } from 'http-proxy-middleware';
app.use(bodyParser.json());
app.use(
'/api',
createProxyMiddleware({
target: 'http://www.example.org',
changeOrigin: true,
on: {
proxyReq: (proxyReq, req) => {
if (req.method !== 'POST' || !req.body) {
return;
}
// mutate parsed request body
req.body.injected = 'server-only';
// write mutated body to the proxied request
fixRequestBody(proxyReq, req);
},
},
}),
);
Intercept and manipulate responses
Intercept responses from upstream with responseInterceptor. (Make sure to set selfHandleResponse: true)
Responses which are compressed with brotli, gzip and deflate will be decompressed automatically. The response will be returned as buffer (docs) which you can manipulate.
With buffer, response manipulation is not limited to text responses (html/css/js, etc...); image manipulation will be possible too. (example)
NOTE: responseInterceptor disables streaming of target's response.
Example:
import { createProxyMiddleware, responseInterceptor } from 'http-proxy-middleware';
const proxy = createProxyMiddleware({
/**
* IMPORTANT: avoid res.end being called automatically
**/
selfHandleResponse: true, // res.end() will be called internally by responseInterceptor()
/**
* Intercept response and replace 'Hello' with 'Goodbye'
**/
on: {
proxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => {
const response = responseBuffer.toString('utf8'); // convert buffer to string
return response.replace('Hello', 'Goodbye'); // manipulate response and return the result
}),
},
});
Check out interception recipes for more examples.
Node.js 17+: ECONNREFUSED issue with IPv6 and localhost (#705)
Node.js 17+ no longer prefers IPv4 over IPv6 for DNS lookups.
E.g. It's not guaranteed that localhost will be resolved to 127.0.0.1 – it might just as well be ::1 (or some other IP address).
If your target server only accepts IPv4 connections, trying to proxy to localhost will fail if resolved to ::1 (IPv6).
Ways to solve it:
- Change
target: "http://localhost"totarget: "http://127.0.0.1"(IPv4). - Change the target server to (also) accept IPv6 connections.
- Add this flag when running
node:node index.js --dns-result-order=ipv4first. (Not recommended.)
Additional IPv6 notes:
- Unspecified IPv6 host
http://[::]:portis normalized to loopback (::1) to reach local listeners.
Note: There’s a thing called Happy Eyeballs which means connecting to both IPv4 and IPv6 in parallel, which Node.js doesn’t have, but explains why for example
curlcan connect.
Debugging
Configure the DEBUG environment variable enable debug logging.
See debug project for more options.
DEBUG=http-proxy-middleware* node server.js
$ http-proxy-middleware proxy created +0ms
$ http-proxy-middleware proxying request to target: 'http://www.example.org' +359ms
Working examples
View and play around with working examples.
- Browser-Sync (example source)
- express (example source)
- connect (example source)
- WebSocket (example source)
- Response Manipulation (example source)
Recipes
View the recipes for common use cases.
Compatible servers
http-proxy-middleware is compatible with the following servers:
- connect
- express
- hono
- next.js
- fastify
- browser-sync
- lite-server
- polka
- grunt-contrib-connect
- grunt-browser-sync
- gulp-connect
- gulp-webserver
Sample implementations can be found in the server recipes.
Tests
Run the test suite:
# install dependencies
$ yarn
# linting
$ yarn lint
$ yarn lint:fix
# building (compile typescript to js)
$ yarn build
# unit tests
$ yarn test
# code coverage
$ yarn coverage
# check spelling mistakes
$ yarn spellcheck
Changelog
- View changelog
License
The MIT License (MIT)
Copyright (c) 2015-2026 Steven Chim
Repo liên quan
Node.js Best Practices, maintained at goldbergyoni/nodebestpractices, is a curated checklist of more than 80 recommendations for building Node.js applications, organized into eight categories from project architecture to Docker. Each entry combines a short recommendation with an explanation of the risk of skipping it and a link to a deeper write-up, rather than being a plain list of links.
NestJS is an open-source Node.js framework at nestjs/nest, written primarily in TypeScript while preserving compatibility with plain JavaScript. Its README frames it as an architecture-first alternative to hand-assembling Express or Fastify, blending object-oriented, functional, and functional-reactive patterns into an Angular-inspired structure. The GitHub description bills it as aimed at server-side software that's efficient, scales, and holds up at enterprise scale, and the repo carries strong community support in the facts provided here.
Express.js is a web framework for Node.js maintained under the expressjs GitHub organization, originally authored by TJ Holowaychuk. The README describes it as fast, unopinionated, and minimalist: it adds routing, middleware support, and HTTP helpers directly on top of Node's HTTP module without forcing a particular ORM or template engine.
A hand-picked, single-file directory of Node.js packages and resources maintained by sindresorhus, split into categories like HTTP, logging, CLI tooling, and web frameworks, released under CC0-1.0.
Trả lời nhanh
chimurai/http-proxy-middleware có những chủ đề gì?
GitHub topics của chimurai/http-proxy-middleware: "browser-sync", "connect", "express", "fastify", "hono", "http-proxy", "httpxy", "javascript", "middleware", "nextjs", "node", "nodejs", "polka", "proxy", "proxy-middleware", "websocket". TopGit xếp repo vào nhóm Backend.
chimurai/http-proxy-middleware có phải mã nguồn mở không?
Có — chimurai/http-proxy-middleware phát hành theo license MIT, nghĩa là mã nguồn mở để đọc, fork và (tùy license) tái sử dụng. Mã: github.com/chimurai/http-proxy-middleware.
chimurai/http-proxy-middleware có website riêng không?
TopGit chưa ghi nhận URL trang chủ cho chimurai/http-proxy-middleware. Phần README ở tab phía trên thường có link demo, hoặc xem mô tả GitHub của repo.
chimurai/http-proxy-middleware còn đang phát triển không?
Commit gần nhất trên chimurai/http-proxy-middleware là 1 tháng trước (theo timestamp GitHub). Repo có 880 fork — một chỉ báo về mức độ quan tâm của cộng đồng.
chimurai/http-proxy-middleware dùng license gì?
chimurai/http-proxy-middleware phát hành theo license MIT. Nên mở file LICENSE trên GitHub để xác nhận — license metadata đôi khi lệch với thực tế dự án.
Đọc thêm về chimurai/http-proxy-middleware ở đâu?
Trang TopGit này là một snapshot — tab "Readme" hiển thị nguyên văn README của repo (đã bỏ link, giữ ảnh). Repo GitHub ở github.com/chimurai/http-proxy-middleware là nguồn chính thức.
Đọc đầy đủ README ở tab phía trên.
Vẫn đang phân vân về http-proxy-middleware?
Một cú bấm sẽ gửi câu hỏi kèm trang này cho AI — xem AI nói gì về http-proxy-middleware.