// server/routes/sitemap.xml.ts type SitemapUrl = { loc: string lastmod?: string changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never' priority?: number } type SitemapConfig = { urls: SitemapUrl[] cache?: { sMaxAge?: number; staleWhileRevalidate?: number } } export default defineEventHandler(async (event) => { const host = (getHeader(event, "host") || getRequestHost(event)).toString() || ""; const baseDomain = process.env.BASE_DOMAIN || ".onstove.com"; const isGameAliasExtractable = host.includes(baseDomain); let gameAlias = ""; if (isGameAliasExtractable) { gameAlias = host.split(".")[0] || ""; } let config: SitemapConfig; try { // 외부 API에서 sitemap 설정 가져오기 const response = await $fetch('https://static-pubcomm.gate8.com/dev/test0905/dataization/test0905_homepage_brand_siteConfig.json') as any; // sitemap 설정에서 urls만 추출 const sitemapUrls = response.sitemap?.urls || []; config = { urls: sitemapUrls, cache: { sMaxAge: 3600, staleWhileRevalidate: 7200 } }; } catch (error) { console.error('Failed to fetch sitemap config:', error); // 에러 발생 시 빈 배열 반환 config = { urls: [], cache: { sMaxAge: 3600, staleWhileRevalidate: 7200 } }; } setHeader(event, "Content-Type", "application/xml; charset=utf-8"); // 캐시 헤더 (CDN 친화) const sMax = config.cache?.sMaxAge ?? 3600; const swr = config.cache?.staleWhileRevalidate ?? 7200; setHeader(event, "Cache-Control", `public, s-maxage=${sMax}, stale-while-revalidate=${swr}`); // XML 생성 const xml = ` ${config.urls.map(url => ` ${url.loc} ${url.lastmod ? ` ${url.lastmod}` : ''} ${url.changefreq ? ` ${url.changefreq}` : ''} ${url.priority ? ` ${url.priority}` : ''} `).join('\n')} `; return xml; });