경로문제 왜 생기나?! > 그누3질답

그누3질답

경로문제 왜 생기나?! 정보

그누보드 경로문제 왜 생기나?!

본문

이 글은 저의 주관적인 생각이며 실제와는 다를 수 있습니다.

게시판의 글을 읽다 보면 경로 문제로 인해 많은 글들이 올라와 있는 것을 볼 수 있다.
그렇다면 경로 문제는 왜 생기는 걸까?
답은 그누보드가 그렇게 만들어 졌기 때문이다. ^^;;

index.php 파일에 보면
<?
require_once "./_lib.php";
require_once "./_head.php";
?>
<?
require_once "./_tail.php";
?>
위 부분이 파일에 첫부분과 끝부분에 들어가며 주내용은 그 사이에 들어 가도록 되어있다.
우리가 주목해야 할 부분은 위 두 부분이다.
먼저 require_once "./_lib.php"; 을 보면 경로 부분이 ./lib.php로 되어 있는데 여기서 . 은 현재 디렉토리를 나타내며 지금 실행되는(여기서는 index.php) 파일이 있는 경로를 나타낸다.
즉 파일 위치에 따라 . 가 의미하는 경로가 변화하게 된다.
그러므로 우리가 사용하려는 index.php를 사용하기 위해서는 같은 경로에 _lib.php, _head.php 과 _tail.php 은 항상 같이 있어야 한다.
index.php 파일이 아니더라도 최근게시물등의 소스를 사용하기 위해서는 세 파일은 현재 실행하려는 파일과 같은 위치에 있어야 한다.
그.러.나 문제는 이것이 아니다.

해더 부분에서 항상 불러 오는 _lib.php 파일을 보면
<?
$reldir = "./board";
require_once "$reldir/lib.inc.php";
?>
와 같은데 우리가 주목해야 할 것은 $reldir = "./board"; 부분이다.
그누보드의 경로를 ./board 으로 하는 것인데 앞에서 이야기 했듯이 . 은 현재 경로를 나타낸다.
여기서는 _lib.php 가 있는 경로를 나타내게 되는데 그누보드가 설치되었을 때의 index.php가 있는 경로에서는 무리 없이 실행이 되지만 만약 다른 경로에서 실행 하려 하면 당연히 에러가 나게 된다.
왜냐하면 _lib.php가 있는 경로가 바뀌었기 때문이다.
그누보드가 설치되어 있는 경로는 항상 고정되어 있다.
그러나 _lib.php의 경로가 바뀌게 되면 현재 경로가 바뀌게 된다.
즉, ./board 는 _lib.php 가 존재하는 경로에 따라 a/board, b/board 등등으로 바뀌게 된다.
당연히 설치되어 있는 그누보드의 위치를 찾을 수 없게 된다.

이 글을 쓰는 본인의 생각은 그누보드가 설치되는 경로가 첫 설치이후 변경되지 않는다면 그 위치로 절대경로를 ./board 대신에 넣었어야 하지 않을까 한다.( ./board 는 현재 파일이 실행되는 위치에 따라 변화하는 상대경로이다. )
물론 이것은 사용하는 사용자들이 직접 입력하도록하며 이에 대한 내용을 주석과 간단한 안내 정도는 해 주는 것이 어떨까 한다.

위와 같은 이유로 현재 그누보드는 첫 설치시에 index.php가 위치한 경로에서만 최근게시물등의 소스 사용이 가능하다.
그 외의 경로에서는 최근게시물등의 소스를 사용 할 수 없다.
( 소스를 수정하지 않고 사용하는 한... )

물론 간단한 소스 수정만으로 사용할 수 있는 부분이지만 초보사용자의 경우( 특히 PHP를 잘 모르는 ) 가장 힘들어 하는 부분이 아닐까 한다.
실제로 유명한(?) 공개 PHP 게시판 프로그램의 경우 절대경로를 사용하는 것이 일반적이다.
( 아닌 경우도 간혹있다. 그누보드처럼.... )

이 글이 경로 문제로 인해 어려움을 겪고 있는 분들에게 조금이나마 도움이 되었으면 하며 틀린점이나 지적할 점이 있으면 알려주세요.
감사합니다. ^^
  • 복사

댓글 전체

차라리 프로그램을 한곳으로 몰아버리면 이런 현상이 발생하지 않을까 하는 생각도 해봅니다.
여러개의 프로그램 때문에 헷갈린다는 분들의 의견을 무시해야 한다는 단점이 있기는 하지만요...
아무리 생각해도 제대로된 답을 구하기가 힘들군요...
흠 ... 전 "./lib.inc.php 이녀석의 안에  자신의 위치를 찾는 스크립트를 넣은 다음 config.inc.php와 사용자 정의 환경설정파일들을 "./lib.inc.php 여기서 자동으로 인클루드 시키게하여 사용하니 경로수정에 문제가 거의 없군요.
자신의 경로는 <?  dirname(__FILE__) ?> 이것을 이용하여 응용하여 사용했습니다.
그누보드 확장성 때문에 무지 고민중인데 결론적으로 상대주소로는 절대 해결을 볼수 없다는 결론(아는게 없어서리..)
root +-------------gnu2----
      + index.html
      + 파일들.html
root +-------gnu2
      +-------main-+ index.html
                            + 파일들.htm
이론씩으로 그누보드와 연동되는게 한디렉토리에 다 모여있으면 상대경로 가능하다.
불러오는게 디렉토리만 다르면 전혀 다른값이 나오기 때문에 확장성을 가지고 만약
--root-+---------gnu2-----
          + index.html
          +---------확장프로그램
이 구도에서 그누보드폴더가 주체형식인 gnuboard.php, gblist.php, gbform.php등등은
문제가 없겠지만 그이외 include, require, require_once하여 불려들여서 쓰게된다면 경로는 전부다
확장프로그램---gnu2폴더안을 찾는 경로오류를 잃으킬 수 밖에 없다는 생각
그누보드가 주체가 아닌 형식은 모두 절대경로 변수넘길시는 cwd폴더상 절대경로를, 변수를 넘기지 않을시는
url절대경로를  사용해서 해결하는게 확장성및 경로에러부분 해결하는 유일은 방법인듯합니다.
단 그누보드 파일상에 require_once "./lib.inc.php"이게 좀 문제라고 보는데 이것만 root폴더를 찾아서 뒤로 찾아가는 방식으로 require_once하면 다른문제는 99%로 잡아질듯한데 phpschool에서 어느님이 팁엔테크로 올려놓은걸 본것 같은데 어제 찾다가 포기....
앗 글작성하는 사이에 희준님께서 코멘트를 작성하셨군요^^
그런데 님과 같은 방법은 인클루드시킬때 문제가 발생합니다...
만약에 root/board/test.php 에서 작업할때와  root/mydoc/thirddrectory/test.php에서 작업하면 문제가 발생한다는 거죠  . 이문제만 없다면 간단하겠죠^^
뭐 님과같은 방법으로 사용해도 작업디렉토리의 깊이만 맞추어 준다면 문제가 없지만요...
그리고 님과 같은 방법을 사용시느느 lib.inc.php를 복사해서 사용하면 함수가 변경될때라든지 수정시에 다시 모든화일을 손대야 되니까 힘이들더군요 해서 lib.inc.php화일을 만들되 복사하지는 않고 lib.inc.php를 자신이 인클루드하는 겁니다. 일종의 ln -s와 같은 링크라고 해야 되겠죠^^
뭐 저도 잘하지는 못하지만 제생각을 말씁드렸습니다...딴지는 아니고 그렇다는 겁니다.....
절대경로를 이용하는것이 좋은방법이 되지않을까요
이용하되 환경변수를 이용해서 어떤서버에 어떤위치에 가져다가 놓아도 자동으로 적용이 되게 하는것이 좋겠습니다.
저는 환경변수 를 이용하여 url처리부분과 include처리부분으로 나누어서 정의를 해놓으니까 서버를 옳겨도 편리하더라구요 .
또 전에는 이런식으로도 사용했었습니다.상대경로를 이용하되 만약 http://xxx.co.kr/~xxx/board/에 보드를 놓았다면 모든경로의 위치를 언제나 일단은 자기계정의 public_html 의 위치로 갔다가 거기서 계산을 하는거죠
예를 들면 현재 자기가 http://xxx.co.kr/~xxx/board/test.php에서 작업할때도 일단은 <img src=../board/test.gif ...>이런식으로 하는거죠 그런데 여기서의 문제점은 보드의 위치와 작업하는 위치의 깊이가 같아야 한다는 문제점이 있더군요 . 그래서 저는 손쉽고 확실한 환경변수를 이용한 절대경로를 정의해서 작업합니다. 확실히 편합니다. 자신의 현재위치를 계산하지 않아도 되니까요 어디위치에서도 자신의 계정루트는 $cfg[root] 이런식으로 인클루드 할때는 사용할수있으니까요.  또한 도메인을 이용할때는 $cfg[url] 이런식. 이런식으로 $cfg[img],$cfg[item]과 같이 원하는 경로를 정의해두면 머리아플 필요도 없더라구요.
하여간 저의 경우에 그렇다는 얘기입니다...
또 만약에 초보자가 사용하기쉽게 하려면 환경파일을 설치시에 자동으로 파일을 만들어주게 설정하는 방법밖에 생각이 안나는군요...
참 서브도메인(3차도메인?) 간의 로그인문제는 세션을 이용하기 때문에 안되는것입니까? 아무도 답변을 안해주네요.--
나중에 한번 되는쪽(쿠키를 이용세션을 기억?? 등의 방법...) 으로 시험을 해봐야겠습니다... (지금은 다른작업이 바빠서리... )
경로 문제때문에 상당히 고민을 하고 있는 중입니다.
절대경로를 입력하지 않고, 소스코드를 수정하지 않고 해결할 수 있는 방안이 있다면 알려주십시오.
파일들을 분리해 놓으면 이런문제가 발생하는군요. ㅡㅡ;
© SIRSOFT
현재 페이지 제일 처음으로