server.proxy
- Type: Record<string, string> | Record<string, ProxyOptions> | ProxyOptions[] | ProxyOptions
- Default: undefined
Configure proxy rules for the dev server or preview server to proxy requests to the specified service.
Example
Basic usage
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',
    },
  },
};
Path rewrite
If you don't 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': '' },
      },
    },
  },
};
Proxy WebSocket
To proxy WebSocket requests, you can enable it through set ws to true:
export default {
  server: {
    proxy: {
      '/rsbuild-hmr': {
        target: 'http://localhost:3000', // will proxy to ws://localhost:3000/rsbuild-hmr
        ws: true,
      },
    },
  },
};
Options
The Rsbuild server proxy makes use of the http-proxy-middleware package. Check out its documentation for more advanced usages.
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 option, Rsbuild also support the bypass and context options.
bypass
Sometimes you don't want to proxy everything. It is possible to bypass the proxy based on the return value of a bypass function.
In the function, you get access to the request, response, and proxy options.
- Return nullorundefinedto continue processing the request with proxy.
- Return trueto continue processing the request without proxy.
- Return falseto produce a 404 error for the request.
- Return a path to serve from, instead of continuing to proxy the request.
- Return a Promise to handle the request asynchronously.
E.g. for a browser request, you want to serve an HTML page, but for an API request, you want to proxy it. You could configure like this:
rsbuild.config.ts
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';
          }
        },
      },
    },
  },
};
context
Used to proxy multiple specified paths to the same target.
export default {
  server: {
    proxy: [
      {
        context: ['/auth', '/api'],
        target: 'http://localhost:3000',
      },
    ],
  },
};