묻고답하기
기본 URL이 지정된 사이트에 멀티도메인 모듈 추가시 생기는 문제
2017.01.06 18:45
안녕하세요. 관리자에서 온갖 시도와 검색을 해봐도 해결방법이 나오지 않아 이렇게 문의 드립니다.
현재 제작중인 사이트에 기본 URL을 지정하여 작업중입니다.
카페24 호스팅을 사용중인데, 이경우 abc.com 과 www.abc.com 처럼 www여부에 따라 도메인을 별도로 처리하기 때문에 웹폰트나 파비콘등을 로딩할 때 문제가 발생합니다.
때문에 @라르게덴 님의 멀티도메인 모듈을 설치하여 사용하려 했지만 기본 URL이 지정된 채로는 멀티도메인 모듈을 사용할 수 없고, 그렇다고 기본 URL을 제거하면 '잘못된 요청입니다'라는 메세지가 출력되며 아무것도 할 수 없는 상태가 됩니다.
또한 그상태에서 멀티도메인 모듈 설정으로 들어가도 모둘선택 부분에서 '잘못된 요청입니다'메세지가 뜨며 멀티도메인 설정도 할 수 없는 상태가 됩니다.
XE초기설치 후 기본 URL을 지정하기 전에 멀티도메인 모듈을 셋팅하면 이런 문제가 없을것 같은데 이미 기본URL을 지정한 상태에서는 멀티도메인 모듈 사용이 불가능한 것 같습니다.
어떻게 하면 기본 URL이 설정된 상태에서 정상적으로 멀티도메인 모듈을 사용할 수 있을까요?
답변 주시면 감사하겠습니다.
댓글 2
-
디자인웰시
2017.01.06 18:46
-
디자인웰시
2017.01.06 21:05
몇주간 이 문제로 골머리를 썩다가 계속된 검색과 xe포럼의 글들을 조합하여 해결방법을 찾아냈습니다.
결정적인 실마리가 된 글은 https://www.xpressengine.com/forum/21620074 입니다.
기존에 기본 URL을 지정한 상태에서 멀티도메인 모듈을 적용하기 위해 기본 URL을 삭제할 경우 CSRF체크로 인해 '잘못된 요청입니다'라는 메세지가 출력되며 xe설정 및 모듈리스트를 불러올 수 없는 현상이 발생합니다.(캐시파일 재생성시에도 마찬가지로 기능이 동작하지 않습니다.)
그렇다고 CSRF를 무조건 true로 풀어버리면 보안 분제가 발생하겠죠.
다행히 라르게덴님의 멀티도메인 모듈도 CSRF기능을 지원하기 때문에 최초 등록된 URL 문제만 해결한다면 정상적으로 적용이 될 것이라는 생각이 들었습니다.
해결 방법은 이렇습니다.
먼저 xe설정에서 기본 URL을 삭제(혹은 files/config/db.config.php 에서 삭제) 후,
xe폴더의 config/func.inc.php 파일을 열어 코어 1.8.27 기준 1609행부터 시작되는 function checkCSRF() 아래줄을 수정해 줍니다.
-수정 전
function checkCSRF()
{
if($_SERVER['REQUEST_METHOD'] != 'POST')
{
return FALSE;
}$default_url = Context::getDefaultUrl();
$referer = $_SERVER["HTTP_REFERER"];if(strpos($default_url, 'xn--') !== FALSE && strpos($referer, 'xn--') === FALSE)
{
require_once(_XE_PATH_ . 'libs/idna_convert/idna_convert.class.php');
$IDN = new idna_convert(array('idn_version' => 2008));
$referer = $IDN->encode($referer);
}$default_url = parse_url($default_url);
$referer = parse_url($referer);$oModuleModel = getModel('module');
$siteModuleInfo = $oModuleModel->getDefaultMid();if($siteModuleInfo->site_srl == 0)
{
if($default_url['host'] !== $referer['host'])
{
return FALSE;
}
}
else
{
$virtualSiteInfo = $oModuleModel->getSiteInfo($siteModuleInfo->site_srl);
if(strtolower($virtualSiteInfo->domain) != strtolower(Context::get('vid')) && !strstr(strtolower($virtualSiteInfo->domain), strtolower($referer['host'])))
{
return FALSE;
}
}return TRUE;
}-수정 후
function checkCSRF()
{return TRUE;
}위와 같이 CSRF체크 부분을 삭제(혹은 주석처리 후) 관리자에서 캐시파일을 재생성하고 config/func.inc.php 파일을 원래대로 복구하면 기존의 기본 URL로 인해 멀티도메인 모듈을 사용할 수 없었던 문제가 해결됩니다.
이에 관한 정확한 해결방법이 검색을 통해 좀처럼 나오지 않아 다른분들에게도 도움이 되셨으면 하여 이렇게 남깁니다.
제작자이신 @라르게덴 님 답변 주신다면 감사하겠습니다.