@@ -0,0 +1,93 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user