diff --git a/layers/middleware/init.route.global.ts b/layers/middleware/init.route.global.ts
index b1138ab..17e7151 100644
--- a/layers/middleware/init.route.global.ts
+++ b/layers/middleware/init.route.global.ts
@@ -10,12 +10,13 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
const serverGameData = getGameDataFromServer()
const gameDataStore = useGameDataStore()
-
+
const { setGameData } = gameDataStore
+
if (serverGameData) {
setGameData(serverGameData)
}
- try{
+ try {
// 서버 사이드에서는 스킵
if (!import.meta.client) {
return
@@ -34,7 +35,7 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
// 쿼리스트링에서 f 파라미터 값 추출 (CSR용)
// const fValue = (to.query.f as string) || ''
-
+
// 미리보기 API 호출 처리
// let finalGameDomain = currentDomain
// if (fValue === 'preview') {
@@ -52,9 +53,12 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
// const { getGameDataExternal } = useGetGameDataExternal()
// await getGameDataExternal(req)
-
// error 페이지는 API 호출하지 않음
- if (pageUrl === '/error' || to.path.includes('/error') || to.path.includes('/inspection')) {
+ if (
+ pageUrl === '/error' ||
+ to.path.includes('/error') ||
+ to.path.includes('/inspection')
+ ) {
return
}
@@ -64,17 +68,17 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
// 현재 언어가 허용된 언어 목록에 없으면 에러 페이지로 이동
if (currentLangCode && !allowedLangCodes.includes(currentLangCode)) {
return navigateTo(`/${currentLangCode}/error`, { external: true })
-
}
} catch (error) {
console.error(error)
- showError(createError({
- statusCode: error.statusCode,
- statusMessage: error.message,
- fatal: false, // 즉시 에러 페이지로
- data: { reason: 'post-not-found' }
- }))
+ showError(
+ createError({
+ statusCode: error?.statusCode || error?.status || 500,
+ statusMessage:
+ error?.statusMessage || error?.message || 'Internal Server Error',
+ fatal: false, // 즉시 에러 페이지로
+ data: { reason: 'post-not-found' },
+ })
+ )
}
-
-
})
diff --git a/layers/middleware/pageData.global.ts b/layers/middleware/pageData.global.ts
index c5e3254..bced751 100644
--- a/layers/middleware/pageData.global.ts
+++ b/layers/middleware/pageData.global.ts
@@ -20,11 +20,7 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
const loadingStore = useLoadingStore()
const { getPathAfterLanguage } = usePathResolver()
-
- const langCode = csrGetFinalLocale(
- to.path,
- gameData.value?.lang_codes,
- )
+ const langCode = csrGetFinalLocale(to.path, gameData.value?.lang_codes)
try {
if (to.path.includes('inspection')) {
@@ -33,18 +29,16 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
}
const pageUrl = getPathAfterLanguage(to.path)
- console.log("🚀 ~ pageUrl:", pageUrl)
// pageUrl이 빈값이거나 null이면 /brand로 리다이렉트
- if (
- !pageUrl ||
- pageUrl === '' ||
- pageUrl === '/' ||
- pageUrl === `/${langCode}/`
- ) {
- return navigateTo(`/${langCode}/brand`, { external: false })
- }
-
+ // if (
+ // !pageUrl ||
+ // pageUrl === '' ||
+ // pageUrl === '/' ||
+ // pageUrl === `/${langCode}/`
+ // ) {
+ // return navigateTo(`/${langCode}/brand`, { external: false })
+ // }
// error 페이지는 API 호출하지 않음
if (pageUrl === '/error' || to.path.includes('/error')) {
@@ -61,7 +55,7 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
// 쿼리스트링에서 f 파라미터 값 추출 (CSR용)
// const fValue = (to.query.f as string) || ''
-
+
// // 미리보기 API 호출 처리
// let finalGameDomain = gameDomain
// if (fValue === 'preview') {
diff --git a/layers/server/middleware/gameData.ts b/layers/server/middleware/gameData.ts
index 691727d..eaa8b4a 100644
--- a/layers/server/middleware/gameData.ts
+++ b/layers/server/middleware/gameData.ts
@@ -67,7 +67,11 @@ const cache = new LRUCache({
* @param finalLocale - 최종 언어
* @param baseDomain - 기본 도메인
*/
-function setFinalLocaleCookie(event: any, finalLocale: string, baseDomain: string) {
+function setFinalLocaleCookie(
+ event: any,
+ finalLocale: string,
+ baseDomain: string
+) {
setCookie(event, 'LOCALE', finalLocale.toLowerCase(), {
domain: baseDomain,
path: '/',
@@ -95,7 +99,6 @@ function fnLocaleMiddleware(event: any, finalLocale: string) {
// 쿼리스트링 포함 시 순수 경로만 추출
arrPath = path.split('?')[0].split('/')
queryString = path.split('?')[1]
-
} else {
arrPath = path.split('/')
queryString = ''
@@ -134,7 +137,7 @@ export default defineEventHandler(async event => {
if (event.node.res.headersSent || event.node.res.writableEnded) {
return
}
-
+
// const runType = `${config.public.runType}`
// console.log("🚀 ~ baseDomain:", config.public.baseDomain)
// const url = getRequestURL(event)
@@ -235,9 +238,14 @@ export default defineEventHandler(async event => {
if (event.node.res.headersSent || event.node.res.writableEnded) {
return
}
-
- // 2. 언어 코드 추출
- finalLocale = ssrGetFinalLocale(event?.node.req.url, event.node.req.headers, initLangCodes, initDefaultLocale)
+
+ // 2. 언어 코드 추출
+ finalLocale = ssrGetFinalLocale(
+ event?.node.req.url,
+ event.node.req.headers,
+ initLangCodes,
+ initDefaultLocale
+ )
const path = event?.node.req.url || ''
let queryStringF = ''
@@ -255,21 +263,22 @@ export default defineEventHandler(async event => {
console.error('쿼리스트링 파싱 에러:', e)
}
}
-
+
// 테스트용 500 에러 발생
if (test500) {
throw new Error('테스트용 500 에러 발생')
}
-
+
// 미리보기 API 호출 처리
if (fValue === 'preview') {
cleanHost = 'samplegame.onstove.com'
}
-
+
const queryParams: Record = {
game_domain: cleanHost || '',
lang_code: finalLocale,
}
+
const response = (await $fetch(apiUrl, {
query: queryParams,
})) as GameDataResponse | null
@@ -283,7 +292,7 @@ export default defineEventHandler(async event => {
event.context.gameData = response.value
event.context.googleAnalyticsId = response.value?.ga_code
- // console.log('🚀 ~ gameData:', response.value)
+ console.log('🚀 ~ gameData:', response.value)
// 점검 데이터 조회
let inspectionData
@@ -305,7 +314,6 @@ export default defineEventHandler(async event => {
)
inspectionData = inspectionResponse?.value?.inspection
cache.set(cacheKey, inspectionData) // 캐시에 저장
- // console.log("🚀 ~ inspectionData:", inspectionData)
}
}
@@ -346,7 +354,10 @@ export default defineEventHandler(async event => {
// 허용된 IP 목록 확인
if (!inspectionData?.ip_filter_list?.includes(clientIP)) {
// 허용되지 않은 IP인 경우 점검 페이지로 이동
- if (!event.node.res.headersSent && !event.node.res.writableEnded) {
+ if (
+ !event.node.res.headersSent &&
+ !event.node.res.writableEnded
+ ) {
event.node.res.statusCode = 302
event.node.res.setHeader('Location', inspectionPath)
event.node.res.end()
@@ -404,6 +415,28 @@ export default defineEventHandler(async event => {
}
}
}
+ // -------------------------------------------------------------------------------
+ // [Root Path Redirect to /home]
+ // 언어 코드만 있는 경로(예: /ko, /ko/)를 /home 리다이렉트
+ // -------------------------------------------------------------------------------
+ const normalizedPath = fullPath.endsWith('/')
+ ? fullPath.slice(0, -1)
+ : fullPath
+ const localePath = `/${finalLocale}`
+ if (normalizedPath === localePath) {
+ const defaultPath = `/${finalLocale}/home`
+ const queryString = event?.node.req.url?.includes('?')
+ ? '?' + event.node.req.url.split('?')[1]
+ : ''
+
+ if (!event.node.res.headersSent && !event.node.res.writableEnded) {
+ event.node.res.statusCode = 302
+ event.node.res.setHeader('Location', defaultPath + queryString)
+ event.node.res.end()
+ return
+ }
+ }
+
// -------------------------------------------------------------------------------
// [Locale Middleware]
// -------------------------------------------------------------------------------
@@ -412,7 +445,7 @@ export default defineEventHandler(async event => {
}
} catch (error) {
console.error('gameData load error:', error)
-
+
// 500 에러 발생 시 /error 페이지로 리다이렉트
if (!event.node.res.headersSent && !event.node.res.writableEnded) {
// 언어 코드 추출 시도
@@ -429,7 +462,7 @@ export default defineEventHandler(async event => {
}
// finalLocale이 undefined인 경우 기본값으로 'ko' 설정
- console.log("🚀 ~ 여기도 타? error:", error)
+ console.log('🚀 ~ 여기도 타? error:', error)
throw createError({
statusCode: error.statusCode,
statusMessage: error.statusMessage,
diff --git a/layers/templates/FxVideo01/index.vue b/layers/templates/FxVideo01/index.vue
index 5915a4d..4da1f5c 100644
--- a/layers/templates/FxVideo01/index.vue
+++ b/layers/templates/FxVideo01/index.vue
@@ -135,6 +135,7 @@ const handleLoadMoreRecent = () => {
class="relative content-static bg-[#fff] rounded-[12px] md:rounded-[16px]"
>
{
-