Next.js rewritesでマイクロサービスAPIプロキシを設定する

問題

フロントエンドはNext.js1つなのに、バックエンドのマイクロサービスがそれぞれ異なるポートで動いています。クライアントから直接呼び出すとCORSの問題が発生します。

解決方法

// next.config.js
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/api/proxy/token/:path*',
        destination: 'http://127.0.0.1:3001/:path*',
      },
      {
        source: '/api/proxy/file/:path*',
        destination: 'http://127.0.0.1:3002/:path*',
      },
    ];
  },
};

module.exports = nextConfig;

クライアントからは/api/proxy/token/verifyのように呼び出すだけです。Next.jsがサーバーサイドでhttp://127.0.0.1:3001/verifyにプロキシしてくれます。

ポイント

  • rewritesはURLを変えずに転送先だけを変更します。redirectsと違い、クライアントからはプロキシの存在が見えません。
  • :path*はワイルドカードで、すべてのサブパスを転送します。/api/proxy/token/a/b/chttp://127.0.0.1:3001/a/b/cにマッピングされます。
  • 同一ドメインからリクエストが送信されるため、CORS設定が不要です。開発環境で特に便利です。