XE코어의 index.php는 무척 간단한 몇 줄의 PHP 구문으로 작성되어 있다. 하지만 index.php는 XE 전반에 걸쳐 가장 중요한 문서이다. 왜냐하면 XE가 기본적으로 사용하는 class파일을 모두 include(포함)한다.
require('./config/ config.inc.php');
위 문장은 단 하나의 config.inc.php 문서파일을 불러오는 것 같지만 사실은 기본적인 환경설정과 함께 XE코어의 함수들을 정의한 함수라이브러리 파일 func.inc.php 문서와 다수의 모든 Class 파일을 include(포함)한다는 뜻이다.
require(XE_PATH.'config/func.inc.php');
그리고
require(XE_PATH.'classes/object/Object.class.php');
require(XE_PATH.'classes/extravar/Extravar.class.php');
require(XE_PATH.'classes/handler/Handler.class.php');
require(XE_PATH.'classes/xml/XmlParser.class.php');
require(XE_PATH.'classes/xml/XmlJsFilter.class.php');
require(XE_PATH.'classes/cache/CacheHandler.class.php');
require(XE_PATH.'classes/context/Context.class.php');
require(XE_PATH.'classes/db/DB.class.php');
require(XE_PATH.'classes/file/FileHandler.class.php');
require(XE_PATH.'classes/widget/WidgetHandler.class.php');
require(XE_PATH.'classes/editor/EditorHandler.class.php');
require(XE_PATH.'classes/module/ModuleObject.class.php');
require(XE_PATH.'classes/module/ModuleHandler.class.php');
require(XE_PATH.'classes/display/DisplayHandler.class.php');
require(XE_PATH.'classes/template/TemplateHandler.class.php');
require(XE_PATH.'classes/mail/Mail.class.php');
require(XE_PATH.'classes/page/PageHandler.class.php');
require(XE_PATH.'classes/mobile/Mobile.class.php');
그런데 왜 include 키워드를 사용하지 않고 require 키워드를 사용하였을까? 둘 다 모두 외부의 파일을 현재 문서에 포함 또는 삽입하는 의미이다. 우선 키워드의 의미를 사전적으로 살펴보자. (언어의 의미를 알면 개념을 쉽게 알 수 있다. - 프로그래밍은 언어 작업이다.)
- include : …을 (부분·요소 등으로서) 포함하다, 함유포괄하다.
- require : … 필요로 하다, …을 요하다 《need보다 딱딱한 말》(권리·권력으로) …을 요구하다;〈법·규칙 등이〉 …을 명하다, 명령하다;(사람에게) …을 요청하다.
PHP에서는 이것을 다음과 같은 경우에 나누어 사용한다.
The two functions are identical in every way, except how they handle errors:
- include() generates a warning, but the script will continue execution
- require() generates a fatal error, and the script will stop
두 가지 기능들이 오류를 제어하는 방법을 제외하고 모든 면에서 동일하다 :
- include()는 경고를 생성하지만, 스크립트는 실행을 계속합니다.
- require()는 치명적인 오류를 생성하고, 스크립트가 중단됩니다.
단어의 의미로 생각해 보면 이해가 쉽다. include(인클루드)는 부드러운 표현이고 어감도 부드럽다...^^ 있으면 좋고 없으면 그만인 것을 포함한다는 의미(?)이고 require(리콰이어)는 매우 권위적이면서(발음도 쌔다) 반드시 필요하다는 의미이다. 만약 요청한 파일이 없다거나 문제가 있는 경우 스크립트를 모두 중단하겠다는 뜻이다...^^ 그래서 처음에 XE를 설치할 때 파일 업로드가 제대로 완료되지 않으면 오류가 발생하면서 설치가 중단되는 군! 따라서 파일업로드는 반드시 파일질라로 해야한다. 그리고 전송 실패한 파일이 있는지도 꼼꼼히 확인해 보아야 한다. 가능하면 SSH로 작업하는 것이 좋다.
기본적인 환경설정과 필요한 클래스(Class) 파일을 모두 불러오면 XE는 Context 객체를 생성하여 초기화하고 환경변수를 세팅한다.
$oContext = &Context;::getInstance();
$oContext->init();
객체변수 $oContext가 클래스(Class) Context 에서 메서드(Method) getInstance()를 호출하여 생성된 객체변수를 참조로 받고, 메서드(Method) init()를 가리키면서 해야 할 일(환경변수 설정)을 시키고 있다.
if($oContext->checkSSO())
checkSSO()는 Single Sign On(SSO)으로 단일 로그인 환경을 확인해 보겠다는 뜻이다. 주석을 보면 "default_url(기본 URL/설정에서 기본 URL을 입력하도록 되어 있다)이 설정되어 있고 현재 url이 default_url과 다르면 SSO인증을 위한 rediret 시도 후 모듈 동작"한다고 설명되어 있다. 이것은 기본 URL과 함께 세션에 저장된 시작 모듈(설정에서 시작 모듈을 선택하여 설정하도록 되어 있다)을 찾아 보여준다는 의미이다. XE에서 시작 모듈을 설정하는 것은 가장 먼저 해야 할 일이다.
XE에서 로그인 풀림 방지
웹사이트에 접속할 때 http 프로토콜 다음에 www를 붙이는 경우와 없는 경우 XE는 로그인 처리에 혼동이 생긴다. 예를 들어 www.xeschool.com으로 웹페이지에 접속하면 index.php는 메서드 checkSSO()를 확인하면서 default_url(기본 URL)과 비교한다. 이때 SSOID의 값을 받아와 세션값을 기본으로 로그인 설정을 위한 쿠키(setcookie(session_name(), $session_name);)를 만들고 header("location:".$url); 로 시작 모듈을 찾아온다.
이때 중요한 것은 기본 URLXE의 기본URL 입력 설정 부분이다의 입력 설정값이 http://www.xeschool.com/xe/ 라면 www 로 접속했을 경우 로그인이 풀리지 않지만, http://xeschool.com/xe/ 로 설정되어 있다면 두 개의 접속 도메인은 분명히 다르고 저장된 쿠키의 내용도 다르기 때문에 다른 모듈로 이동할 경우 로그인이 풀리는 듯한 현상이 발생한다. 다시 원래의 모듈로 돌아오면 로그인 되어 있다! 반대의 경우에도 마찬가지다. 따라서 XE 설정에서 기본 URL 입력 설정을 꼭 확인하고(www를 붙인 경우와 아닌 경우) 아래의 소스를 index.php 파일의 기본 상수 선언 --- define('ZBXE', true); --- 다음 줄에 추가하도록 하자. (아래 소스는 공식홈의 XE 사용팁에서 ezi님이 소개한 로그인 풀림방지-주소 고정하기에 소개된 내용이다.)
xe/index.php 파일을 열고
define('ZBXE', true); 다음행에 아래코드를 추가한다.
www 를 붙여 사용하지 않는 경우 :
preg_match('@^(www\\.)(.*)@', $_SERVER'HTTP_HOST', $www_url);
if($www_url1) {
@header('Location: http://' . $www_url2 . $_SERVER'REQUEST_URI');
}
www 를 붙여 사용하는 경우 :
preg_match('@^(www\\.)(.*)@', $_SERVER'HTTP_HOST', $www_url);
if(!$www_url1) {
@header('Location: <http://www>.' . $_SERVER'HTTP_HOST' . $_SERVER'REQUEST_URI');
}
※ 위 내용은 XE코어 index.php 파일을 수정하는 내용이기 때문에 최초 설치 및 버전 업그레이드시에 재수정하여 업로드해야 한다.
자료 출처 : 로그인풀림방지 - 주소 고정하기