[재수정]윈도우 APM에서 경로문제로 설치가 되지 않는 경우 해결법
[재수정-2013.3.18 17:51] 경로 중간에 '/'이 누락될 가능성이 있어 추가합니다.
[-추가- 2013.3.18 1:10] 코멘트에서는 코드가 SyntaxHighlighter 적용이 되지 않아 보기가 좋지 않아 원글을 수정했습니다.]
문제의 원인은 DOCUMENT_ROOT와 실제 g4s가 설치된 경로가 다르기 때문에 나타납니다.
예를 들어 APM설치를 하고 DOCUMENT_ROOT를 C:\public\www로 설정하였고 g4s는 www폴더 아래 설치하는 것이 아니라 C:\public\boards\g4s처럼 할 수도 있습니다. 그렇게 되면 경로문제로 인해 설치가 진행되지 않습니다. 그누보드 설치하기 경로가 제대로 나오지 않는거죠.
그렇기 때문에 common.php에서 g4_path 함수에서 해주어야 할 작업은 $_SERVER['DOCUMENT_ROOT']와 dirname(__FILE__)를 비교하여 dirname(__FILE__)이 $_SERVER['DOCUMENT_ROOT']로 시작되지 않는다면 DOCUMENT_ROOT와 실제 파일이 존재하는 경로가 다른 경우라고 판단하고 이에 맞게경로를 찾아야 합니다.
예:
[code]
var_dump($_SERVER['DOCUMENT_ROOT']): "C:/public/www"
var_dump(dirname(__FILE__)): "C:\public\boards\g4s"
[/code]
이런 경우 path설정은 $_SERVER['DOCUMENT_ROOT']이 아닌 dirname(__FILE__)을 이용해야 합니다. 또한 되도록이면 $path의 디렉토리 세퍼레이터 역시 역슬레쉬가 아닌 리눅스방식으로 교체하는 것이 좋기 때문에 g4_path 함수를 다음으로 교체하면 됩니다.
또 그누가 설치된 곳과 그누를 불러오는 파일의 경로가 다른 경우도 생각해보아야 합니다. 그누보드 설치는 /boards/g4s에 설치하였으나 메인 페이지는 /boards/main에다 스크립트 파일을 놓고 그누를 불러올 경우가 그 예입니다. 다음 g4_path 함수를 이용하면 경로를 잘 가져옵니다.
테스트:
그누보드 설치경로: /www/boards/gnu/g4s
테스트 파일 위치:
1. /www/boards/main ---> 결과 OK
2. /www/boards/gnu ---> 결과 OK
3. /www/boards/gnu/g4s ---> 결과 OK
[code]
function g4_path()
{
$path = dirname(__FILE__); // 예) /home/sir/www/g4s
$linux_dir = str_replace("\\", "/", $path); // 예) /home/sir/www/g4s
$document_root = str_replace("\\", "/", $_SERVER['DOCUMENT_ROOT']); // 예) /home/sir/www
if (strpos($linux_dir, $document_root) === false) {
// DOCUMENT_ROOT와 실제 실행파일 경로가 다른 경우
// 예:
// var_dump($_SERVER['DOCUMENT_ROOT']): "C:/public/www"
// var_dump(dirname(__FILE__)): "C:\public\boards\g4s"
//
// 이런 경우는 SCRIPT_NAME에서 디렉토리 경로를 하나씩 올라가면서 linux_dir에 그 디렉토리가 존재하면
// 그 때가 우리가 원하는 $base_dir이 된다.
for($base_dir = dirname($_SERVER['SCRIPT_NAME']); strpos($linux_dir, $base_dir) === false; $base_dir = dirname($base_dir));
if (strlen($base_dir) && strlen($linux_dir) != (strrpos($linux_dir, $base_dir)+strlen($base_dir))) {
// 만일 스크립트가 g4s가 설치된 곳이 아닌 디렉토리라면
// $linux_dir에서 $base_dir이 시작되는 포지션값과 $base_dir 스트링 길이를 합한 값이 $lnux_dir 스트링 길이와 일치하지 않게 된다.
//
// 예:
// $linux_dir = 'C:/public/boards/g4s'
// dirname($_SERVER['SCRIPT_NAME']) = '/boards/main'
// $base_dir = /boards
// 이런 경우는 $base_dir로 나온 값을 기준으로 $linux_dir에서 가져오면 된다.
// $lnux_dir에서 $base_dir에서부터 뽑아오면 /boards/g4s가 된다. 이것이 우리가 원하는 값...
//
// $lnux_dir = 'C:/public/boards/g4s'
// dirname($_SERVER['SCRIPT_NAME'] = '/boards'
// $base_dir = '/boards'
// $lnux_dir에서 $base_dir에서부터 뽑아오면 /boards/g4s가 된다. 이것이 우리가 원하는 값...
$base_dir = substr($linux_dir, strrpos($linux_dir, $base_dir));
}
}
else {
$base_dir = preg_replace('#^'.$document_root.'#i', '', $linux_dir); // 예) /g4s
}
// $base_dir 스트링 길이가 0이 아니면, 앞에 '/'이 오도록 설정
if (strlen($base_dir) && substr($base_dir, 0, 1) != '/') $base_dir = '/'.$base_dir;
$port = $_SERVER['SERVER_PORT'] != 80 ? ':'.$_SERVER['SERVER_PORT'] : '';
$http = 'http' . ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') ? 's' : '') . '://';
$result = array();
// 윈도우의 경우 역슬레쉬 경로인데 그다지 권장하지 않는다. php에서는 슬레쉬도 경로 인자로 인식하므로 슬레쉬 사용.
//$result['path'] = $path;
$result['path'] = $linux_dir;
$result['url'] = $http.$_SERVER['SERVER_NAME'].$port.$base_dir;
$result['curr_url'] = $http.$_SERVER['SERVER_NAME'].$port.$_SERVER['PHP_SELF'];
$result['curr_uri'] = $result['curr_url'] . ($_SERVER['QUERY_STRING'] ? '?'.$_SERVER['QUERY_STRING'] : '');
return $result;
}
[/code]
[-추가- 2013.3.18 1:10] 코멘트에서는 코드가 SyntaxHighlighter 적용이 되지 않아 보기가 좋지 않아 원글을 수정했습니다.]
문제의 원인은 DOCUMENT_ROOT와 실제 g4s가 설치된 경로가 다르기 때문에 나타납니다.
예를 들어 APM설치를 하고 DOCUMENT_ROOT를 C:\public\www로 설정하였고 g4s는 www폴더 아래 설치하는 것이 아니라 C:\public\boards\g4s처럼 할 수도 있습니다. 그렇게 되면 경로문제로 인해 설치가 진행되지 않습니다. 그누보드 설치하기 경로가 제대로 나오지 않는거죠.
그렇기 때문에 common.php에서 g4_path 함수에서 해주어야 할 작업은 $_SERVER['DOCUMENT_ROOT']와 dirname(__FILE__)를 비교하여 dirname(__FILE__)이 $_SERVER['DOCUMENT_ROOT']로 시작되지 않는다면 DOCUMENT_ROOT와 실제 파일이 존재하는 경로가 다른 경우라고 판단하고 이에 맞게경로를 찾아야 합니다.
예:
[code]
var_dump($_SERVER['DOCUMENT_ROOT']): "C:/public/www"
var_dump(dirname(__FILE__)): "C:\public\boards\g4s"
[/code]
이런 경우 path설정은 $_SERVER['DOCUMENT_ROOT']이 아닌 dirname(__FILE__)을 이용해야 합니다. 또한 되도록이면 $path의 디렉토리 세퍼레이터 역시 역슬레쉬가 아닌 리눅스방식으로 교체하는 것이 좋기 때문에 g4_path 함수를 다음으로 교체하면 됩니다.
또 그누가 설치된 곳과 그누를 불러오는 파일의 경로가 다른 경우도 생각해보아야 합니다. 그누보드 설치는 /boards/g4s에 설치하였으나 메인 페이지는 /boards/main에다 스크립트 파일을 놓고 그누를 불러올 경우가 그 예입니다. 다음 g4_path 함수를 이용하면 경로를 잘 가져옵니다.
테스트:
그누보드 설치경로: /www/boards/gnu/g4s
테스트 파일 위치:
1. /www/boards/main ---> 결과 OK
2. /www/boards/gnu ---> 결과 OK
3. /www/boards/gnu/g4s ---> 결과 OK
[code]
function g4_path()
{
$path = dirname(__FILE__); // 예) /home/sir/www/g4s
$linux_dir = str_replace("\\", "/", $path); // 예) /home/sir/www/g4s
$document_root = str_replace("\\", "/", $_SERVER['DOCUMENT_ROOT']); // 예) /home/sir/www
if (strpos($linux_dir, $document_root) === false) {
// DOCUMENT_ROOT와 실제 실행파일 경로가 다른 경우
// 예:
// var_dump($_SERVER['DOCUMENT_ROOT']): "C:/public/www"
// var_dump(dirname(__FILE__)): "C:\public\boards\g4s"
//
// 이런 경우는 SCRIPT_NAME에서 디렉토리 경로를 하나씩 올라가면서 linux_dir에 그 디렉토리가 존재하면
// 그 때가 우리가 원하는 $base_dir이 된다.
for($base_dir = dirname($_SERVER['SCRIPT_NAME']); strpos($linux_dir, $base_dir) === false; $base_dir = dirname($base_dir));
if (strlen($base_dir) && strlen($linux_dir) != (strrpos($linux_dir, $base_dir)+strlen($base_dir))) {
// 만일 스크립트가 g4s가 설치된 곳이 아닌 디렉토리라면
// $linux_dir에서 $base_dir이 시작되는 포지션값과 $base_dir 스트링 길이를 합한 값이 $lnux_dir 스트링 길이와 일치하지 않게 된다.
//
// 예:
// $linux_dir = 'C:/public/boards/g4s'
// dirname($_SERVER['SCRIPT_NAME']) = '/boards/main'
// $base_dir = /boards
// 이런 경우는 $base_dir로 나온 값을 기준으로 $linux_dir에서 가져오면 된다.
// $lnux_dir에서 $base_dir에서부터 뽑아오면 /boards/g4s가 된다. 이것이 우리가 원하는 값...
//
// $lnux_dir = 'C:/public/boards/g4s'
// dirname($_SERVER['SCRIPT_NAME'] = '/boards'
// $base_dir = '/boards'
// $lnux_dir에서 $base_dir에서부터 뽑아오면 /boards/g4s가 된다. 이것이 우리가 원하는 값...
$base_dir = substr($linux_dir, strrpos($linux_dir, $base_dir));
}
}
else {
$base_dir = preg_replace('#^'.$document_root.'#i', '', $linux_dir); // 예) /g4s
}
// $base_dir 스트링 길이가 0이 아니면, 앞에 '/'이 오도록 설정
if (strlen($base_dir) && substr($base_dir, 0, 1) != '/') $base_dir = '/'.$base_dir;
$port = $_SERVER['SERVER_PORT'] != 80 ? ':'.$_SERVER['SERVER_PORT'] : '';
$http = 'http' . ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') ? 's' : '') . '://';
$result = array();
// 윈도우의 경우 역슬레쉬 경로인데 그다지 권장하지 않는다. php에서는 슬레쉬도 경로 인자로 인식하므로 슬레쉬 사용.
//$result['path'] = $path;
$result['path'] = $linux_dir;
$result['url'] = $http.$_SERVER['SERVER_NAME'].$port.$base_dir;
$result['curr_url'] = $http.$_SERVER['SERVER_NAME'].$port.$_SERVER['PHP_SELF'];
$result['curr_uri'] = $result['curr_url'] . ($_SERVER['QUERY_STRING'] ? '?'.$_SERVER['QUERY_STRING'] : '');
return $result;
}
[/code]
|
댓글을 작성하시려면 로그인이 필요합니다.
댓글 1개
./lib/common.lib.php 파일에서 직접 우회소스 적용했다가 다른 문제가 발생하는 등 원만하지 못한 것 같아서 원상복구했습니다.
그리고 원개발자들의 의도를 신뢰해보자고 마음먹고... 고민 끝에 아래처럼 해결했습니다.
./config.php 파일에서,
define('G4_DOMAIN', 'http://g4s가 설치된 전체주소:포트");
정상적으로 출력되고 별다른 문제도 없었습니다.
그누보드에 익숙하지 않아서 정확한 처리인지는 확신을 못하겠습니다만,
로컬접속, 외부접속 모두 아직까지 별다른 문제는 없군요.