import process from "node:process"; import type { NextConfig } from "next"; /** 本地调试代理目标,见 config/*.env / .env.local 的 API_PROXY_TARGET */ const apiProxyTarget = (process.env.API_PROXY_TARGET || "").replace(/\/$/, ""); const appEnv = process.env.APP_ENV; const nextConfig: NextConfig = { output: "standalone", // 仅在显式 APP_ENV=test|development 时分目录;未设置 / production 仍用 .next distDir: appEnv === "test" ? ".next-test" : appEnv === "development" ? ".next-dev" : ".next", poweredByHeader: false, cacheComponents: true, partialPrefetching: true, turbopack: { rules: { "*.css": { loaders: ["@tailwindcss/turbopack"], as: "*.css", }, }, }, async headers() { const xml = [{ key: "Content-Type", value: "application/xml; charset=utf-8" }]; const xsl = [{ key: "Content-Type", value: "text/xsl; charset=utf-8" }]; return [ { source: "/sitemap.xml", headers: xml }, { source: "/sitemaps/:file", headers: xml }, { source: "/static/sitemapindex.xsl", headers: xsl }, { source: "/static/sitemap.xsl", headers: xsl }, ]; }, async redirects() { // 枢纽入口 / 旧中文排序段 → 英文规范 URL return [ { source: "/short-drama", destination: "/short-drama/hot", permanent: true }, { source: "/video", destination: "/video/hot", permanent: true }, { source: "/short-drama/热度优先", destination: "/short-drama/hot", permanent: true }, { source: "/short-drama/热度优先/:path*", destination: "/short-drama/hot/:path*", permanent: true }, { source: "/short-drama/最近更新", destination: "/short-drama/latest", permanent: true }, { source: "/short-drama/最近更新/:path*", destination: "/short-drama/latest/:path*", permanent: true }, { source: "/video/热度优先", destination: "/video/hot", permanent: true }, { source: "/video/热度优先/:path*", destination: "/video/hot/:path*", permanent: true }, { source: "/video/最近更新", destination: "/video/latest", permanent: true }, { source: "/video/最近更新/:path*", destination: "/video/latest/:path*", permanent: true }, { source: "/ranking", destination: "/ranking/drama", permanent: true }, { source: "/ranking/短剧", destination: "/ranking/drama", permanent: true }, { source: "/ranking/短剧/:path*", destination: "/ranking/drama/:path*", permanent: true }, { source: "/ranking/视频", destination: "/ranking/video", permanent: true }, { source: "/ranking/视频/:path*", destination: "/ranking/video/:path*", permanent: true }, // 专题排序段:中文 → 英文 { source: "/topic/:kind/:key/编辑排序", destination: "/topic/:kind/:key/editorial", permanent: true }, { source: "/topic/:kind/:key/编辑排序/:page", destination: "/topic/:kind/:key/editorial/:page", permanent: true }, { source: "/topic/:kind/:key/最新", destination: "/topic/:kind/:key/latest", permanent: true }, { source: "/topic/:kind/:key/最新/:page", destination: "/topic/:kind/:key/latest/:page", permanent: true }, { source: "/topic/:kind/:key/最热", destination: "/topic/:kind/:key/hot", permanent: true }, { source: "/topic/:kind/:key/最热/:page", destination: "/topic/:kind/:key/hot/:page", permanent: true }, ]; }, async rewrites() { if (!apiProxyTarget) return []; return [ { source: "/api/:path*", destination: `${apiProxyTarget}/api/:path*`, }, // 加密 HLS:相对路径经同域代理(对齐 hkdj-web / 1045) { source: "/h5/m3u8/:path*", destination: `${apiProxyTarget}/h5/m3u8/:path*`, }, { source: "/enkey", destination: `${apiProxyTarget}/enkey`, }, { source: "/enkey/:path*", destination: `${apiProxyTarget}/enkey/:path*`, }, { source: "/newenkey", destination: `${apiProxyTarget}/newenkey`, }, { source: "/newenkey/:path*", destination: `${apiProxyTarget}/newenkey/:path*`, }, ]; }, }; export default nextConfig;