~/zafer
Tüm yazılara dön
2 dk okuma

Next.js rewrites() ile Üç Ayrı Dev Server'ı Tek Origin Arkasında Birleştirmek

Üç uygulama üç ayrı süreç, üç ayrı port: apps/web 3900'de, apps/api 3901'de, apps/admin 3902'de. Ama tarayıcıdan /api/posts ya da /admin'e gidildiğinde, hiçbir CORS hatası ya da farklı origin uyarısı görünmüyor — çünkü tarayıcı hiçbir zaman 3901/3902'ye doğrudan istek atmıyor.

// apps/web/next.config.ts
async rewrites() {
  return [
    { source: "/api/:path*", destination: `${API_ORIGIN}/api/:path*` },
    { source: "/admin", destination: `${ADMIN_ORIGIN}/admin/` },
    { source: "/admin/:path*", destination: `${ADMIN_ORIGIN}/admin/:path*` },
  ];
}

Rewrite, redirect değil

Bir redirect, tarayıcıya "başka bir URL'e git" der — adres çubuğu değişir, ayrı bir origin'e yeni bir istek atılır. rewrite ise sunucu tarafında şeffaf bir proxy: tarayıcı localhost:3900/api/posts'a istek atıyor sanıyor, Next.js bu isteği arkada localhost:3901/api/posts'a yönlendirip cevabı aynen geri veriyor. Tarayıcının gözünde tek bir origin var; CORS hiç devreye girmiyor çünkü CORS zaten farklı origin'ler arası isteklerde bir sorun — burada öyle bir istek hiç oluşmuyor.

Bu neden production'da da işe yarayacak şekilde tasarlandı

const API_ORIGIN = process.env.API_ORIGIN ?? "http://localhost:3901";
const ADMIN_ORIGIN = process.env.ADMIN_ORIGIN ?? "http://localhost:3902";

Hedef origin'ler ortam değişkeninden okunuyor. Prod'da API_ORIGIN/ADMIN_ORIGIN gerçek internal servis adreslerine işaret edecek, ama rewrites() kuralının kendisi hiç değişmeyecek — Next.js hâlâ dış dünyaya tek bir origin gösterip arkada üç ayrı servise proxy'liyor olacak. Yerel geliştirmedeki "üç port" gerçeği, prod'daki "tek domain, üç iç servis" mimarisinin bire bir küçük ölçekli simülasyonu.

Admin için neden iki ayrı rewrite kuralı

/admin (trailing slash yok) ve /admin/:path* ayrı tanımlanıyor çünkü Vite'ın base: "/admin/" ile build ettiği static admin uygulaması kendi içinde trailing-slash'e duyarlı routing bekliyor — tek bir :path* deseni /admin'in kendisini (boş path) doğru şekilde /admin/'e yönlendirmeyebilirdi.