const basePath = "/docedit"; // prefix ระดับแอปของ judes-note ใน route tree (app/note/**) + statics (public/note/**) // — basePath /docedit เป็นของกลางแชร์กับแอปพี่น้อง (เช่น wordaddin ในอนาคต) // URL ปลายทางจึงยังเป็น /docedit/note/… เหมือนเดิมทุกจุด const appPath = "/note"; /** @type {import('next').NextConfig} */ const nextConfig = { // สำหรับ Docker (docker/web.Dockerfile) — build แล้วได้ .next/standalone รันด้วย node server.js output: "standalone", // serve ใต้ /docedit + route ทั้งหมดอยู่ใต้ app/note/** — /next/navigation เติม basePath // ให้เอง แต่ต้องเขียน path รวม /note (เช่น href="/note/login") ส่วน fetch/EventSource/ // plain /workerSrc ต้องผ่าน withBasePath() (utils/base-path.ts — เติม base + /note) basePath, // expose ให้โค้ดใช้ (inline ตอน build) — ค่าจริงประกาศที่เดียวที่ไฟล์นี้ env: { NEXT_PUBLIC_BASE_PATH: basePath, NEXT_PUBLIC_APP_PATH: appPath }, // ปิด redirect trailing slash อัตโนมัติของ Next (308 /docedit → /docedit/ // และ /docedit/note/ → /docedit/note) — deploy หลัง IIS แล้ว redirect พวกนี้ // ตีกับ rewrite rule ของ IIS จนกลายเป็น ping-pong loop; ปิดให้หน้า/ไฟล์ทุกอย่าง // serve ได้ทั้งแบบมี/ไม่มี slash ฝั่ง proxy เป็นคนกำหนดเอง skipTrailingSlashRedirect: true, // จับเฉพาะ root ของ host ("/" แท้ ๆ — basePath:false ทำให้ rule นี้ไม่จับ // /docedit) เผื่อ IIS ส่ง path "/" เข้า process: ส่งตรงไป /docedit/note เลย // ส่วน /docedit และ /docedit/ จับที่ app/page.tsx แทน (ส่งต่อ query เอง — // รักษาสัญญาลิงก์ e-Court /docedit/?fileUrl=&fileId=&typeId=) async redirects() { return [ { source: "/", destination: `${basePath}${appPath}`, basePath: false, // ป้องกัน basePath ซ้อน (destination เขียนเต็มแล้ว) permanent: false, }, ]; }, // N4 อัปโหลดไฟล์ผ่าน Server Action — default 1MB ไม่พอสำหรับ PDF/สแกนศาล (ต้องตรงกับ MAX_UPLOAD_BYTES ใน app/actions/files.ts) experimental: { serverActions: { bodySizeLimit: "100mb", }, }, }; export default nextConfig;