라우팅 경로정리 & CDN용 정적파일 경로 추상화

This commit is contained in:
Lectom C Han
2026-02-05 12:22:02 +09:00
parent 8501529eb6
commit 46b30af839
6 changed files with 82 additions and 16 deletions

View File

@@ -14,3 +14,7 @@ OIDC_CLIENT_SECRET=
OIDC_REDIRECT_URL= OIDC_REDIRECT_URL=
OIDC_SCOPES=openid profile email OIDC_SCOPES=openid profile email
IDP_SERVICE_URL= IDP_SERVICE_URL=
# 정적 자산 CDN (선택)
# 예: STATIC_CDN_BASE_URL=https://cdn.example.com/kngil
STATIC_CDN_BASE_URL=

View File

@@ -1,19 +1,45 @@
RewriteEngine On RewriteEngine On
# /adm -> /admin (관리자 루프 방지)
RewriteRule ^adm/?$ /admin [R=301,L]
# 대소문자 혼용 경로 보정
RewriteRule ^(kngil/)?js/lib/ScrollToPlugin\.min\.js$ /js/lib/scrollToPlugin.min.js [R=301,L]
# 레거시 /kngil/skin/adm*.php -> /admin(/company)
RewriteCond %{THE_REQUEST} \s/+kngil/skin/adm_comp\.php [NC]
RewriteRule ^kngil/skin/adm_comp\.php$ /admin/company [R=301,L]
RewriteCond %{THE_REQUEST} \s/+kngil/skin/adm\.php [NC]
RewriteRule ^kngil/skin/adm\.php$ /admin [R=301,L]
# 레거시 /kngil/skin/index.php -> /
RewriteCond %{THE_REQUEST} \s/+kngil/skin/index\.php [NC]
RewriteRule ^kngil/skin/index\.php$ / [R=301,L]
# 레거시 /kngil/skin/*.php -> /* (확장자 제거) # 레거시 /kngil/skin/*.php -> /* (확장자 제거)
RewriteCond %{THE_REQUEST} \s/+kngil/skin/([^\s]+)\.php [NC]
RewriteRule ^kngil/skin/([^/]+)\.php$ /$1 [R=301,L] RewriteRule ^kngil/skin/([^/]+)\.php$ /$1 [R=301,L]
# 레거시 /kngil/*.php -> /* (확장자 제거) # 레거시 /kngil/*.php -> /* (확장자 제거)
RewriteCond %{THE_REQUEST} \s/+kngil/([^\s]+)\.php [NC]
RewriteRule ^kngil/([^/]+)\.php$ /$1 [R=301,L] RewriteRule ^kngil/([^/]+)\.php$ /$1 [R=301,L]
# 레거시 /kngil 또는 /kngil/ -> / # 레거시 /kngil 또는 /kngil/ -> /
RewriteCond %{THE_REQUEST} \s/+kngil/?\s [NC]
RewriteRule ^kngil/?$ / [R=301,L] RewriteRule ^kngil/?$ / [R=301,L]
# 정적 파일 CDN 리다이렉트(옵션: STATIC_CDN_BASE_URL 환경변수)
RewriteCond %{ENV:STATIC_CDN_BASE_URL} !=""
RewriteRule ^(kngil/)?(js|css|img|fonts|download|uploads|vendor)/(.*)$ %{ENV:STATIC_CDN_BASE_URL}/$2/$3 [R=302,L]
# 기존 파일/디렉터리는 그대로 통과 # 기존 파일/디렉터리는 그대로 통과
RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L] RewriteRule ^ - [L]
# 정적 파일 루트 경로 -> /kngil/ 경로로 내부 라우팅
RewriteRule ^(js|css|img|fonts|download|uploads|vendor)/(.*)$ /kngil/$1/$2 [L]
# Admin UI # Admin UI
RewriteRule ^admin/?$ /kngil/skin/adm.php [L] RewriteRule ^admin/?$ /kngil/skin/adm.php [L]
RewriteRule ^admin/company/?$ /kngil/skin/adm_comp.php [L] RewriteRule ^admin/company/?$ /kngil/skin/adm_comp.php [L]

View File

@@ -31,6 +31,17 @@ docker compose down
- `OIDC_SCOPES` (예: `openid profile email`) - `OIDC_SCOPES` (예: `openid profile email`)
- `IDP_SERVICE_URL` (예: `https://idp.example.com`) - `IDP_SERVICE_URL` (예: `https://idp.example.com`)
### 정적 자산 CDN (선택)
정적 파일(`/js`, `/css`, `/img`, `/fonts`, `/download`, `/uploads`, `/vendor`)을 CDN으로 리다이렉트하려면
웹 서버 환경변수 `STATIC_CDN_BASE_URL`을 설정하세요. (값이 있으면 302 리다이렉트)
예시:
```bash
STATIC_CDN_BASE_URL=https://cdn.example.com/kngil
```
> 참고: 이 변수는 Apache의 Rewrite 환경변수로 사용됩니다. Docker Compose를 사용한다면 web 서비스의 환경변수로 전달해도 됩니다.
## DB 초기화 ## DB 초기화
- `kngil_DB` 덤프는 **처음 실행 시** 자동으로 로드됩니다. - `kngil_DB` 덤프는 **처음 실행 시** 자동으로 로드됩니다.
- 이미 생성된 볼륨이 있으면 재적용되지 않습니다. 다시 초기화하려면 아래를 실행하세요. - 이미 생성된 볼륨이 있으면 재적용되지 않습니다. 다시 초기화하려면 아래를 실행하세요.

25
kngil/img/favicon.svg Normal file
View File

@@ -0,0 +1,25 @@
<?xml version="1.0"?>
<svg width="64" height="64" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" data-name="레이어_2">
<defs>
<style>.cls-1 {
fill: #231815;
}
.cls-2 {
fill: #ca2829;
}
.cls-3 {
fill: #263b7c;
}</style>
</defs>
<g class="layer">
<title>Layer 1</title>
<g data-name="레이어_1" id="_레이어_1-2">
<g id="svg_1">
<path class="cls-2" d="m31.59,31.61c-1.81,0.72 -2.76,0.04 -3.19,-0.47l-4.83,5.85c-4.09,4.9 -8.97,6.79 -12.69,5.16l19.3,-23.16s1.93,-2.63 4.12,-4.35l0,0c0.16,-0.12 0.21,-0.25 0.18,-0.47c-0.14,-0.58 -1.42,-0.97 -2.96,-0.95l0,0l-3.83,0.02s-1.42,-0.07 -2.35,0c-0.19,0.02 -2.67,0.12 -3.48,0.21c-0.86,0.07 -3.04,0.46 -3.66,0.63c-3.91,1.07 -7.67,2.98 -10.57,6.37c-3.83,4.46 -5.82,9.74 -5.6,14.85c0.16,3.77 1.52,7.09 3.83,9.34c2.18,2.11 4.9,3.21 7.86,3.21c0.76,0 1.54,-0.07 2.32,-0.21c3.85,-0.72 7.61,-3.18 10.9,-7.13l6.98,-8.44c-0.23,-0.32 -0.91,-1 -2.28,-0.46l0,0l-0.06,0zm-25.04,3.46c-0.16,-3.69 1.36,-7.62 4.32,-11.03c3.5,-4.04 6.34,-5.23 9.05,-5.41c1.26,-0.09 2.41,0.09 3.68,0.72l-16.17,19.45c-0.53,-1.07 -0.82,-2.35 -0.88,-3.72l0,0l0,-0.02z" id="svg_2"/>
<path class="cls-3" d="m61.56,25.31c-0.31,-3.84 -1.98,-7.27 -4.59,-9.41c-6.23,-5.13 -13.46,-3.39 -19.87,4.74l-7.3,8.83l0,0l-0.6,0.74c0.14,0.21 0.66,0.75 2.04,0.19c1.69,-0.68 2.86,0.04 3.42,0.72l1.03,-1.25l4.75,-5.74l0.04,-0.05c4.88,-6.2 9.53,-7.57 13.83,-4.02c1.56,1.28 2.55,3.37 2.74,5.72c0.29,3.55 -1.11,7.58 -4.2,11.1c-4.34,4.92 -8.52,6.37 -12.72,4.86l6.27,-7.72l-3.35,-3.49l-9.36,11.53s-1.87,2.55 -4.03,4.27c-0.23,0.16 -0.33,0.28 -0.27,0.54c0.12,0.56 1.34,0.93 2.82,0.95l0.02,0l3.91,0s3.33,0.02 4.03,-0.04c0.14,-0.02 2.49,-0.23 2.96,-0.26c0.41,-0.04 2.43,-0.44 2.9,-0.56c3.97,-1.12 7.18,-2.93 10.18,-6.57c3.91,-4.71 5.84,-10.08 5.43,-15.12l0,0l-0.08,0.04z" id="svg_3"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -9,23 +9,23 @@
<link <link
rel="shortcut icon" rel="shortcut icon"
type="image/svg+xml" type="image/svg+xml"
href="/kngil/img/favicon.svg" href="/img/favicon.svg"
/> />
<!-- CSS --> <!-- CSS -->
<link rel="stylesheet" href="/kngil/css/lib/aos.min.css" /> <link rel="stylesheet" href="/css/lib/aos.min.css" />
<link rel="stylesheet" type="text/css" href="/kngil/css/lib/lenis.min.css" /> <link rel="stylesheet" type="text/css" href="/css/lib/lenis.min.css" />
<link rel="stylesheet" type="text/css" href="/kngil/css/common.css" /> <link rel="stylesheet" type="text/css" href="/css/common.css" />
<link rel="stylesheet" type="text/css" href="/kngil/css/style.css" /> <link rel="stylesheet" type="text/css" href="/css/style.css" />
<!-- JS (local) --> <!-- JS (local) -->
<script src="/kngil/js/lib/jquery-3.6.1.min.js"></script> <script src="/js/lib/jquery-3.6.1.min.js"></script>
<script src="/kngil/js/lib/jquery.mousewheel.min.js"></script> <script src="/js/lib/jquery.mousewheel.min.js"></script>
<script src="/kngil/js/lib/lenis.min.js"></script> <script src="/js/lib/lenis.min.js"></script>
<script src="/kngil/js/lib/aos.min.js"></script> <script src="/js/lib/aos.min.js"></script>
<script src="/kngil/js/lib/gsap.min.js"></script> <script src="/js/lib/gsap.min.js"></script>
<script src="/kngil/js/lib/scrolltrigger.min.js"></script> <script src="/js/lib/scrolltrigger.min.js"></script>
<script src="/kngil/js/lib/ScrollToPlugin.min.js"></script> <script src="/js/lib/scrollToPlugin.min.js"></script>
<!-- ScrollMagic (외부 CDN 유지) --> <!-- ScrollMagic (외부 CDN 유지) -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script>

View File

@@ -8,9 +8,9 @@
<link <link
rel="shortcut icon" rel="shortcut icon"
type="image/svg+xml" type="image/svg+xml"
href="/kngil/img/favicon.svg" href="/img/favicon.svg"
/> />
<link rel="stylesheet" type="text/css" href="/kngil/css/common.css" /> <link rel="stylesheet" type="text/css" href="/css/common.css" />
<link rel="stylesheet" type="text/css" href="/kngil/css/style.css" /> <link rel="stylesheet" type="text/css" href="/css/style.css" />
<script src="./js/lib/jquery-3.6.1.min.js"></script> <script src="/js/lib/jquery-3.6.1.min.js"></script>