From ebc5bd15bb79ca8cebec8ca7eeb8d84a384e52bf Mon Sep 17 00:00:00 2001 From: anime Date: Fri, 3 Jan 2025 00:34:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0UUID?= =?UTF-8?q?=E5=8F=8A=E5=85=B6=E5=8E=BB=E9=99=A4-=E5=BD=A2=E5=BC=8F?= =?UTF-8?q?=E9=87=8D=E5=AE=9A=E5=90=91=E5=88=B0slug):?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/redirect.js | 15 +++++++++++++++ middleware.ts | 27 +++++++++++++++++++++++++-- pages/index.js | 3 +++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 lib/redirect.js diff --git a/lib/redirect.js b/lib/redirect.js new file mode 100644 index 00000000..7a05dfee --- /dev/null +++ b/lib/redirect.js @@ -0,0 +1,15 @@ +import fs from 'fs' + +export function generateRedirectJson({ allPages }) { + let uuidSlugMap = {} + allPages.forEach(page => { + if (page.type === 'Post' && page.status === 'Published') { + uuidSlugMap[page.id] = page.slug + } + }) + try { + fs.writeFileSync('./public/redirect.json', JSON.stringify(uuidSlugMap)) + } catch (error) { + console.warn('无法写入文件', error) + } +} diff --git a/middleware.ts b/middleware.ts index dc623d08..c60ee9cd 100644 --- a/middleware.ts +++ b/middleware.ts @@ -1,5 +1,7 @@ import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server' -import { NextResponse } from 'next/server' +import { NextRequest, NextResponse } from 'next/server' +import { checkStrIsNotionId, getLastPartOfUrl } from '@/lib/utils' +import { idToUuid } from 'notion-utils' /** * Clerk 身份验证中间件 @@ -30,8 +32,29 @@ const isTenantAdminRoute = createRouteMatcher([ * @returns */ // eslint-disable-next-line @typescript-eslint/require-await, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars -const noAuthMiddleware = async (req: any, ev: any) => { +const noAuthMiddleware = async (req: NextRequest, ev: any) => { // 如果没有配置 Clerk 相关环境变量,返回一个默认响应或者继续处理请求 + let redirectJson: Record = {} + try { + const response = await fetch(`${req.nextUrl.origin}/redirect.json`) + if (response.ok) { + redirectJson = (await response.json()) as Record + } + } catch (err) { + console.error('Error fetching static file:', err) + } + let lastPart = getLastPartOfUrl(req.nextUrl.pathname) as string + if (checkStrIsNotionId(lastPart)) { + lastPart = idToUuid(lastPart) + } + if (lastPart && redirectJson[lastPart]) { + const redirectToUrl = req.nextUrl.clone() + redirectToUrl.pathname = '/' + redirectJson[lastPart] + console.log( + `redirect from ${req.nextUrl.pathname} to ${redirectToUrl.pathname}` + ) + return NextResponse.redirect(redirectToUrl) + } return NextResponse.next() } /** diff --git a/pages/index.js b/pages/index.js index 31e2610b..a83d42c8 100644 --- a/pages/index.js +++ b/pages/index.js @@ -5,6 +5,7 @@ import { generateRobotsTxt } from '@/lib/robots.txt' import { generateRss } from '@/lib/rss' import { generateSitemapXml } from '@/lib/sitemap.xml' import { DynamicLayout } from '@/themes/theme' +import { generateRedirectJson } from '@/lib/redirect' /** * 首页布局 @@ -60,6 +61,8 @@ export async function getStaticProps(req) { generateRss(props) // 生成 generateSitemapXml(props) + // 生成重定向 JSON + generateRedirectJson(props) // 生成全文索引 - 仅在 yarn build 时执行 && process.env.npm_lifecycle_event === 'build'