Middleware: Satpam & Proxy 👮
Middleware adalah kode yang dieksekusi SEBELUM sebuah halaman selesai dimuat.
File wajibnya bernama: middleware.ts di root project.
Dia punya dua kekuatan utama:
- Satpam (Redirect): Nendang user ke halaman lain.
- Proxy (Rewrite): Nampilin konten dari URL lain tanpa ganti URL di browser.
1. Mode Satpam (Redirect) 🚧
Ini dipake buat proteksi halaman (Authentication).
URL browser BERUBAH (misal dari /dashboard jadi /login).
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
export function middleware(request: NextRequest) {
const token = request.cookies.get("token");
// Kalau gak ada token, tendang ke login
if (!token) {
return NextResponse.redirect(new URL("/login", request.url));
}
}2. Mode Proxy (Rewrite) 🎭
Ini fitur canggihnya. Lo bisa bikin URL /blog di website lo, padahal aslinya ngambil data dari https://medium.com/@username (opens in a new tab). URL browser TETAP /blog. User gak tau kalau itu sebenernya Medium.
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
export function middleware(request: NextRequest) {
// Kalau user buka /blog-luar
if (request.nextUrl.pathname.startsWith("/blog-luar")) {
// Tampilkan isi dari website lain (Proxy)
// Browser user tetep nampilin domain lo, padahal isinya dari luar
return NextResponse.rewrite(
new URL(
"[https://landing-page-lain.com](https://landing-page-lain.com)",
request.url
)
);
}
}Kegunaan Proxy Mode:
-
Multi-Tenant: Bikin user1.website.com sebenernya ngakses /user/1.
-
Legacy Support: Nampilin halaman dari website lama lo di domain baru secara diam-diam.
-
Masking API: Sembunyiin URL API asli biar gak ketahuan user.
3. Konfigurasi Matcher 🎯
Biar middleware gak jalan di semua request (bikin lemot), atur matcher.
export const config = {
// Middleware cuma jalan di rute ini aja:
matcher: ["/dashboard/:path*", "/blog-luar/:path*"],
};Kesimpulan: Middleware itu file middleware.ts. Tapi di dalamnya, lo bisa
milih mau jadi Satpam (Redirect) atau Joki (Rewrite/Proxy).