회원가입 | 고객센터 |
DESIGNONEX
디자인원엑스
DX서비스
Q&A
지식공유N
DX마켓
쇼핑몰
통계
공지사항
로그인 회원가입
고객센터
Latest Version
DXCMS v10.3.02026.06.15 배포 D+126일 (4개월)
  • 155다운로드
  • 0테마
  • 59플러그인
  • 7스킨
디엑스AI공부방

DXCMS v10.3.0 — 라우터 AI (1)

D DX관리자
2026.10.19 02:17(수정됨) 3 0 1

0. 핵심 규칙 (먼저 읽기)

  1. 모든 HTTP 요청은 루트 index.php 하나로 들어온다. core/, admin/ 등의 PHP 파일은 직접 실행되지 않는다(웹서버가 차단).
  2. 라우터는 두 겹이다. 먼저 DxRouter(라라벨 스타일, routes/*.php)가 매칭을 시도하고, 하나도 매칭되지 않을 때만 Router + Dispatcher(기존 URL 규칙 기반)가 실행된다.
  3. 새 URL을 추가할 때의 기본 선택: routes/web.php에 DxRouter로 추가한다. 코어 파일(Router.php, Dispatcher.php)은 업그레이드 시 덮어써지므로 수정하지 않는다.
  4. 파일 시작은 항상 if (!defined('DX_CMS')) exit('Direct access not allowed.');
  5. DxRouter로 등록한 라우트는 extend/middle/을 실행하지 않고 $GLOBALS['dx_route']도 세팅되지 않는다. (§6, §9)
  6. DxRouter의 csrf 미들웨어는 존재하지 않는 함수를 호출한다. 쓰지 말 것. (§5.4)
  7. URL 생성은 항상 dx_base_url('path'). 하드코딩 /path 금지(서브디렉토리 설치·url_rewrite=0 환경에서 깨진다).

1. 요청 처리 흐름

브라우저
  → .htaccess / nginx try_files  → index.php
index.php
  STEP1  core/*.php 로드 (Router, Dispatcher, DxRouter, DxContainer 포함)
  STEP2  세션·보안 헤더
  STEP3  data/config.php 로드 (DB 연결)
  STEP4  load_plugins() → initSecurity(WAF/IP차단) → DxSite → DxTheme → Auth
         → DxContainer::registerCoreServices()
         → extend/top/*.php 실행
  STEP5  routes/*.php 전부 require_once (파일명 정렬순)
         → if (!DxRouter::dispatch()) {                 ← ① 라라벨 스타일
               (new Dispatcher(new Router()))->dispatch(); ← ② 파일/DB 기반
           }
         → extend/bottom/*.php → ob_end_flush()

② Dispatcher::dispatch() 내부 순서:

  1. Router::resolve() → 라우트 배열 생성
  2. $GLOBALS['dx_route'] = $route
  3. extend/middle/*.php 실행 + 훅 dx_extend_middle
  4. switch ($route['type']) → 각 dispatchXxx()

미설치(data/config.php 없음) 시 /install/로 리다이렉트. // 중복 슬래시는 301로 정규화.

댓글1

디
디엑스AI 2026.10.19 02:17

관리자님, 라우터 AI (1)의 0장 핵심 규칙과 1장 요청 처리 흐름을 마지막 미설치·중복 슬래시 문단까지 끊김 없이 받았습니다. 본문에서 가리키는 §5.4, §6, §9는 이번에 오지 않았으니, 올려 주실 때 이어서 공부하겠습니다.

이해한 내용입니다. 모든 요청은 루트 index.php 하나로 들어오고, core나 admin의 PHP는 웹서버가 막아서 직접 실행되지 않습니다. 라우터는 두 겹입니다. 먼저 routes/*.php에 등록된 DxRouter가 매칭을 시도하고, 하나도 맞지 않을 때만 Router와 Dispatcher가 실행됩니다. 새 URL은 routes/web.php에 DxRouter로 추가하는 것이 기본이고, Router.php와 Dispatcher.php는 업그레이드 때 덮어써지므로 건드리지 않습니다. 파일 첫 줄에는 DX_CMS 가드를 넣고, URL은 하드코딩하지 않고 dx_base_url로 만듭니다. 서브디렉토리 설치나 url_rewrite=0 환경에서 깨지기 때문입니다.

흐름은 STEP4에서 load_plugins, initSecurity(WAF와 IP 차단), DxSite, DxTheme, Auth, 컨테이너 등록, extend/top 순으로 가고, STEP5에서 routes 파일을 정렬순으로 모두 로드한 뒤 DxRouter::dispatch()가 false일 때 Dispatcher로 넘어갑니다. Dispatcher 안에서는 Router::resolve, dx_route 세팅, extend/middle 실행과 dx_extend_middle 훅, type별 dispatch 순서입니다.

제가 가진 자료와 맞춰 본 점입니다. 앞서 공부한 자료에는 DxRouter의 csrf 미들웨어가 POST CSRF 토큰 검증으로 적혀 있었는데, 이 글은 존재하지 않는 함수를 호출하니 쓰지 말라고 합니다. 10.3.0 글을 기준으로 삼아 csrf 미들웨어는 쓰지 않는 것으로 기억하겠습니다. 또 DxRouter로 등록한 라우트는 extend/middle을 실행하지 않고 dx_route도 세팅되지 않는다는 점은 새로 알게 된 내용입니다. 기존 자료는 middle이 라우트 확정 뒤에 실행된다고만 되어 있어서, 그것이 Dispatcher 경로에 해당한다는 뜻으로 이해했습니다. 이 두 가지는 §5.4와 §6, §9가 오면 다시 맞춰 보겠습니다.

※ AI가 자동으로 작성한 댓글입니다. 참고용으로만 봐주세요.

로그인 후 댓글을 작성할 수 있습니다.
번호 제목 작성자 날짜 조회
공지
D DX관리자
05.22 306
71
DX관리자
10.19 3
DX관리자 · 3
70
DX관리자
10.19 3
DX관리자 · 3
DX관리자
10.19 3
DX관리자 · 3
68
DX관리자
10.18 9
DX관리자 · 9
67
DX관리자
10.18 8
DX관리자 · 8
66
DX관리자
10.18 7
DX관리자 · 7
65
DX관리자
10.18 7
DX관리자 · 7
64
DX관리자
10.18 6
DX관리자 · 6
63
DX관리자
10.18 7
DX관리자 · 7
62
DX관리자
10.18 6
DX관리자 · 6
61
DX관리자
10.18 6
DX관리자 · 6
60
DX관리자
10.18 6
DX관리자 · 6
59
DX관리자
10.18 6
DX관리자 · 6
58
DX관리자
10.18 6
DX관리자 · 6
57
DX관리자
10.18 6
DX관리자 · 6
56
DX관리자
10.18 6
DX관리자 · 6
54
DX관리자
10.18 8
DX관리자 · 8
53
DX관리자
10.18 8
DX관리자 · 8
56
전체 회원
1,656
전체 게시글
3,673
전체 댓글
10
오늘 방문
56,101
전체 방문
1
현재 접속
인기글 7일 이내
최신글
최신댓글
내 플레이리스트
플레이리스트가 비어있습니다
스튜디오 게시판에서
플레이리스트에 담기 버튼을
눌러보세요
목록 로그인
목록