type ProxyConfig =
| Record<string, string | ProxyOptions>
| ProxyOptions[]
| ProxyOptions;undefinedConfigure proxy rules for the dev server or preview server to proxy requests to the specified service.
export default {
server: {
proxy: {
// http://localhost:3000/api -> http://localhost:3000/api
// http://localhost:3000/api/foo -> http://localhost:3000/api/foo
'/api': 'http://localhost:3000',
},
},
};A request to /api/users will now proxy the request to http://localhost:3000/api/users.
You can also proxy to an online domain name, such as:
export default {
server: {
proxy: {
// http://localhost:3000/api -> https://nodejs.org/api
// http://localhost:3000/api/foo -> https://nodejs.org/api/foo
'/api': 'https://nodejs.org',
},
},
};If you do not want /api to be passed along, we need to rewrite the path:
export default {
server: {
proxy: {
// http://localhost:3000/api -> http://localhost:3000
// http://localhost:3000/api/foo -> http://localhost:3000/foo
'/api': {
target: 'http://localhost:3000',
pathRewrite: { '^/api': '' },
},
},
},
};To proxy WebSocket requests, set ws to true:
export default {
server: {
proxy: {
'/rsbuild-hmr': {
target: 'http://localhost:3000', // will proxy to ws://localhost:3000/rsbuild-hmr
ws: true,
},
},
},
};The Rsbuild server proxy uses the http-proxy-middleware package. Check out its documentation for more advanced usage.
The full type definition of Rsbuild server proxy is:
import type { Options as HttpProxyOptions } from 'http-proxy-middleware';
type Filter = string | string[] | ((pathname: string, req: Request) => boolean);
type ProxyOptions = HttpProxyOptions & {
bypass?: (
req: IncomingMessage,
res: ServerResponse,
proxyOptions: ProxyOptions,
) => MaybePromise<string | undefined | null | boolean>;
context?: Filter;
};
type ProxyConfig =
| ProxyOptions
| ProxyOptions[]
| Record<string, string>
| Record<string, ProxyOptions>;In addition to the http-proxy-middleware options, Rsbuild also supports the bypass and context options.
Sometimes you don't want to proxy everything. You can bypass the proxy based on the return value of a bypass function.
In the function, you have access to the request, response, and proxy options.
null or undefined to continue processing the request with proxy.true to continue processing the request without proxy.false to produce a 404 error for the request.For example, for a browser request, you want to serve an HTML page, but for an API request, you want to proxy it. You could configure it like this:
export default {
server: {
proxy: {
'/api': {
target: 'http://localhost:3000',
bypass(req, res, proxyOptions) {
if (req.headers.accept.indexOf('html') !== -1) {
console.log('Skipping proxy for browser request.');
return '/index.html';
}
},
},
},
},
};Used to proxy multiple specified paths to the same target.
export default {
server: {
proxy: [
{
context: ['/auth', '/api'],
target: 'http://localhost:3000',
},
],
},
};