fix. 서버 미들웨어, 미들웨어 수정
This commit is contained in:
88
layers/utils/urlUtil.ts
Normal file
88
layers/utils/urlUtil.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
import { getHeader, getRequestHost, type H3Event } from 'h3'
|
||||
|
||||
/**
|
||||
* 게임 도메인을 가져오는 컴포저블 함수
|
||||
* 서버와 클라이언트 환경에서 모두 동작
|
||||
* @param event - H3 이벤트 객체 (서버 미들웨어에서 직접 전달 가능)
|
||||
* @returns 게임 도메인 문자열
|
||||
*/
|
||||
export const getGameDomain = (event?: H3Event): string => {
|
||||
try {
|
||||
let host = ''
|
||||
|
||||
// 클라이언트 환경에서는 window.location.host를 사용
|
||||
if (import.meta.client) {
|
||||
host = (window.location.host || '').split(':')[0]
|
||||
}
|
||||
|
||||
// 서버 환경에서는 event 객체를 사용
|
||||
if (import.meta.server) {
|
||||
if (!event) return ''
|
||||
|
||||
// 미들웨어에서 설정한 gameDomain이 있다면 우선 사용
|
||||
if (event.context.gameDomain) {
|
||||
host = event.context.gameDomain
|
||||
} else {
|
||||
const serverHost =
|
||||
getHeader(event, 'host') || getRequestHost(event) || ''
|
||||
host = serverHost.split(':')[0]
|
||||
}
|
||||
}
|
||||
|
||||
if (!host) return ''
|
||||
|
||||
// dev2 호스트명인 경우 l9-dev.onstove.com을 사용
|
||||
if (host === 'samplegame-dev2.onstove.com') {
|
||||
return 'l9-dev.onstove.com'
|
||||
}
|
||||
|
||||
return host
|
||||
} catch (error) {
|
||||
console.error('getGameDomain error:', error)
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* URL에서 언어 코드를 추출하는 함수
|
||||
* @param url - URL 문자열
|
||||
* @returns 언어 코드 문자열
|
||||
*/
|
||||
export const getPathLocale = (url?: string): string => {
|
||||
const targetUrl = url || (import.meta.client ? window.location.pathname : '')
|
||||
const cleanTargetUrl = targetUrl.endsWith('/')
|
||||
? targetUrl.slice(0, -1)
|
||||
: targetUrl
|
||||
|
||||
return cleanTargetUrl.split('/')[1]
|
||||
}
|
||||
|
||||
/**
|
||||
* URL에서 언어 코드 이후의 경로를 추출하는 함수
|
||||
* @param url - URL 문자열
|
||||
* @returns 언어 코드 이후의 경로 문자열
|
||||
*/
|
||||
export const getPathAfterLanguage = (url?: string): string => {
|
||||
const targetUrl = url || (import.meta.client ? window.location.pathname : '')
|
||||
const cleanTargetUrl = targetUrl.endsWith('/')
|
||||
? targetUrl.slice(0, -1)
|
||||
: targetUrl
|
||||
|
||||
// URL에서 언어 코드 패턴을 찾아서 그 뒤의 경로를 추출
|
||||
// 예: /ko/about/story -> /about/story
|
||||
// 예: /ko -> "" (빈 문자열)
|
||||
const languagePattern = /^\/[a-z]{2}(-[a-z]{2})?\/(.+)$/
|
||||
const match = cleanTargetUrl.match(languagePattern)
|
||||
if (match && match[2]) {
|
||||
return `/${match[2]}`
|
||||
} else {
|
||||
// 언어 코드만 있고 뒤에 아무것도 없는 경우 (예: /ko, /en, /zh-tw, /zh-cn)
|
||||
const languageOnlyPattern = /^\/[a-z]{2}(-[a-z]{2})?$/
|
||||
if (languageOnlyPattern.test(cleanTargetUrl)) {
|
||||
return ''
|
||||
} else {
|
||||
// 언어 코드가 없는 경우 원본 경로 그대로 반환 (이미 /로 시작)
|
||||
return cleanTargetUrl
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user