From 17455aa47b5166e630488cbc6d99f069b786af05 Mon Sep 17 00:00:00 2001 From: Gigi Date: Thu, 16 Oct 2025 15:20:10 +0200 Subject: [PATCH] fix(api): serve index.html to browsers with preserved URL Instead of redirecting, serve the static index.html file directly. The Vercel rewrite preserves the /a/{naddr} URL, allowing client-side SPA routing to work correctly. --- api/article-og.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/api/article-og.ts b/api/article-og.ts index e8aee1e1..42814982 100644 --- a/api/article-og.ts +++ b/api/article-og.ts @@ -214,11 +214,26 @@ export default async function handler(req: VercelRequest, res: VercelResponse) { const userAgent = req.headers['user-agent'] as string | undefined - // If it's a regular browser (not a bot), redirect to index.html - // and let the SPA handle routing client-side + // If it's a regular browser (not a bot), serve index.html + // The rewrite preserves the URL, so SPA routing will handle /a/{naddr} if (!isCrawler(userAgent)) { - res.setHeader('Location', '/') - return res.status(302).send('') + // Import the static index.html and serve it + // This preserves the /a/{naddr} URL for client-side routing + const fs = await import('fs') + const path = await import('path') + // eslint-disable-next-line no-undef + const indexPath = path.join(process.cwd(), 'dist', 'index.html') + + try { + const indexHtml = fs.readFileSync(indexPath, 'utf-8') + res.setHeader('Content-Type', 'text/html; charset=utf-8') + res.setHeader('Cache-Control', 'public, max-age=0, must-revalidate') + return res.status(200).send(indexHtml) + } catch (err) { + // Fallback if dist/index.html doesn't exist (dev mode) + res.setHeader('Location', '/') + return res.status(302).send('') + } } // Check cache for bots/crawlers