type ProxyConfig =
| Record<string, string | ProxyOptions>
| ProxyOptions[]
| ProxyOptions;
undefined
Configure 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',
},
],
},
};