6. 웹서버 설정
6.1 모든 서버 공통 원칙
- 모든 요청을 루트
index.php로 보낸다.admin/,boards/같은 실제 디렉터리가 있어도 그대로 넘긴다 (try_files에서$uri/제거). - 루트
index.php와install/*.php외의.php직접 실행을 차단한다. - 차단 대상 경로:
core,extend,controllers,routes,docs,data(단data/uploads제외). - 허용 정적 경로:
assets/,data/uploads/,themes/(정적 파일만). - 보안 헤더는 서버 설정이 없어도
Secure::sendSecurityHeaders()가 PHP에서 직접 발행한다.
6.2 Apache (.htaccess, 루트 포함 13개)
Options -Indexes -MultiViews,DirectorySlash Off(폴더 접근 시 301로 POST가 GET이 되는 문제 방지)RewriteBase없음 → 하위 디렉터리 설치 자동 대응- 우선순위: ①
assets/,data/uploads/,themes/즉시[L]②core|extend|controllers|routes|docs→[F]③data/(uploads 제외)→[F]④install/→[L]⑤ 존재하는 정적 파일(PHP 제외) 직접 서빙 ⑥sitemap*.xml,robots.txt→index.php⑦ POST 및 나머지 전부 →index.php <FilesMatch "\.php$">전체Require all denied,index.php와migrate.php만granted- 서브폴더
.htaccess:core/,core/auth/,core/security/전체 거부;admin/,boards/,themes/,pages/는.php거부 +-Indexes;assets/ckeditor4/는.php*거부;data/uploads/는 서빙 허용 +.php거부 - 민감 확장자
env|log|bak|sql|conf|ini|sh|bat거부
6.3 IIS (이 사용자의 운영 환경)
[주의] 이 ZIP에는 루트 web.config가 없다. (README는 web.config, web.config.no-rewrite가 있다고 쓰지만 포함되지 않았다.) 존재하는 것은 install/web.config 뿐이며, 내용은 httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough" 한 줄이다. .htaccess는 IIS에서 동작하지 않는다. 따라서 IIS에서는 다음을 web.config로 직접 재현해야 한다 (§6.1 원칙):
- URL Rewrite: 정적 파일·
assets/·data/uploads/·themes/·install/제외 후index.php로 보냄 core,extend,controllers,routes,docs,data(uploads 제외) 요청 차단(hiddenSegments또는 deny 규칙).php직접 실행 제한- URL Rewrite 모듈이 없으면
index.php?_url=/free/view/123형식으로 동작 (dx_base_url()이url_rewrite설정에 따라 이 형식을 생성) data/sessions에 IIS 앱풀 계정(IUSR / IIS_IUSRS)의 쓰기 권한 필요cleanup_sessions.php를 Windows 작업 스케줄러에 등록(§8.2)
6.4 Nginx (nginx.conf.example, DXCMS 10.2 기준)
핵심: location / { try_files $uri /index.php?$query_string; }, location = /index.php 만 FastCGI 실행, location ~ \.php$ { deny all; }, ^~ /data/ 와 core|extend|controllers|routes|docs 403, ^~ /install/ 안에서만 PHP 허용(fastcgi_read_timeout 300), client_max_body_size 50m, fastcgi_intercept_errors on, error_page 403 404 /index.php. PHP-FPM 소켓은 set $dx_php ... 한 줄만 수정. include fastcgi_params를 빼면 HTTPS 판별이 깨져 http 링크가 생성된다. 서버 패널(aaPanel/BT)은 자동 삽입된 include enable-php-XX.conf;를 주석 처리해야 내부 PHP 직접 실행 차단이 유지된다.
6.5 리버스 프록시 / Cloudflare
- HTTPS 판별과
Secure::clientIp()가HTTP_X_FORWARDED_PROTO,CF-Visitor,CF-Connecting-IP,X-Forwarded-For를 본다. - 신뢰 프록시 범위(
trustedProxyRanges) 에서 온 요청만 이 헤더를 신뢰한다:127.0.0.1/32,10/8,172.16/12,192.168/16, Cloudflare IPv4 대역 일부(173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13). Cloudflare IPv6 대역은 목록에 없다.