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 null or undefined to continue processing the request with proxy.
  • Return true to continue processing the request without proxy.
  • Return false to 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',
      },
    ],
  },
};