탈 디렉토리로 암데서나 G4를 구현하는 Auto Sample PAge. > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

탈 디렉토리로 암데서나 G4를 구현하는 Auto Sample PAge. 정보

탈 디렉토리로 암데서나 G4를 구현하는 Auto Sample PAge.

본문

<?
#########################################################
# 좀 더 자유롭게 디렉토리를 만들어 페이지를 구현하고 싶거나..
# 그누보드를 접한지 얼마 안되신 분들...
# 깔끔성 페이지나 그누보드로 버젼별 웹디하시는 분들이 디렉토리를 벗어나고
# 싶을때...사용하시길 바랍니다...또는 접속이 안될때 이 페이지를 쓰세요.
# 4시간이나 걸린 방대한 프로젝트 였습니다..
# 전쟁은 강한자가 이긴게 아니라 이긴자가 강한거야...황산벌...푸헐~~ㅋ 
#
# 설치된 디렉토리를 벗어나 원하는 방을 만들고 방에 방을 만들고...암데나..자동으로
# index.php 나 아니면 zzz.php 로 적용하여 쓰실수 있습니다.
# sample 입니다...위에서 슥 긁어서 저장하시면 됩니다.
#
# 아래는 각설.
# 절대경로:
# 세상에서 하나뿐인 유일한 길.
# http://당신의도메인/그누보드가설치된방 입니다.(마지막엔 /를 붙이지 않습니다)
# 쉬운예로 나는 남자이고 여동생이 있는데 동생의 이름은 김삼순이라면
# 절대경로는 http://김삼순 입니다.
#
# 하지만
# 상대경로:
# 상대경로는 기준이 되는 사람과의 관계에 따라 달라집니다.
# 제 딸아이의 입장에서 본다면 김삼순 이라는 절대경로를 부를때
# http://김삼순 해도 문제가 없을것입니다.
# 그러나 http라는 프로토콜은 내부의 주소를 우선시 합니다.
# 쉽게 말해
# 상대적으로 아버지의 여동생 즉, "고모" 라고 부르면 될 일을
# 부를때마다 태양계 지구국 대한민국 서울시 영등포구 개봉동 100번지 김삼순 ㅡㅡㅋ
# 낭비겠죠?
#
# 부르는 사람을 기준으로한 상대경로...초보에게는 이게 문제 입니다.
# 디렉토리 확장을 못합니다..
#
# 현재 사용자가 고모를 찾고 있습니다.
#
# 즉 김삼순을 찾아서 루트를 기준으로 lib 파일을 인클루드 해야 하는데...
#
# 루트에서는,즉 main의 index.php는 이렇게 되어 있습니다.
# ./_common.php 하면 맞습니다.
#
# [?
# include_once("./_common.php");
# include_once("$g4[path]/lib/latest.lib.php");
# $g4[title] = "";
# include_once("./_head.php");
# ?]
 
# 그러나
# 제로보드 익숙한 사람이거나
# 어느 누구나 그러하듯...방대한 싸이트를 꿈꾸는 이용자들은
# 방을 따로 만듭니다.
# 예로 community 라고 만들고
# 이 방에도 index.php 나 index.htm..l ...jsp...등을 둡니다.
# 그래서
# ./ 내방
# ../ 상대적으로 상위의 방
# ../../할아버지방 식으로 개념을 잡고서리...
#
# 그 새로만든 방안에 index.php 의 상단을 이렇게 꾸미겠죠?
#
#[?
# include_once("../_common.php");
# ↑이렇게 바꾸면 _common.php 에서는 $g4_path 는 . 이 할당이 됩니다.
# ----------------------------------------------------------------
# include_once("$g4[path]/lib/latest.lib.php");
# $g4[title] = "";
# include_once("./_head.php");
# ?]
#
# 그러면 에러는 없습니다.
# 올커니 되었다...이제 ./head.php 만 인클루드 하자라고 생각하고..
#
# include_once("../_head.php");
# ↑이렇게 바꾸니까 아래의 멧세지가 나옵니다.
# ----------------------------------------------------------------
#
// index.php 가 있는곳의 상대경로
// php 인젝션 ( 임의로 변수조작으로 인한 리모트공격) 취약점에 대비한 코드
// prosper 님께서 알려주셨습니다.
# if (!$g4_path || preg_match("/:\/\//", $g4_path))
#    die("<script language='JavaScript'> alert('잘못된 방법으로 변수가 정의되었습니다.'); </script>");   
// if (!$g4_path) $g4_path = ".";
# $g4[path] = $g4_path;
#
#
#
# 여기서 포기하는 유저들이 10명??? 은 넘겠죠...
#
# ----------------------------------------------------------------
# 여차저차...머리를 쓰면 아래와 같이 해결합니다.
# G4가 설치된 방에 community 방을 만들었다면
#
# [?
# $g4_path = "..";
# include_once("$g4_path/common.php");
# include_once("$g4[path]/lib/latest.lib.php");
# $g4[title] = "";
# include_once("$g4[path]/_head.php");
# ?]
# ----------------------------------------------------------------
#
# G4가 설치된 방/skin/board/community 방을 만들었다면
# [?
# $g4_path = "../../..";
# include_once("$g4_path/common.php");
# include_once("$g4[path]/lib/latest.lib.php");
# $g4[title] = "";
# include_once("$g4[path]/_head.php");
# ?]
#
#이렇게 해결하실것입니다.
#어쩌면 절대경로와 상대경로를 잘 아는 사람일겁니다.
#
# ----------------------------------------------------------------
# 초보의 입장에서도..
# 이런 고생을 줄여보자는 취지에서
# 또 자신의 페이지에서 방만들고 어쩌고 하는데 좀 자유롭게 하기 위해서는
# $g4_path 이것을 해결해야 합니다.
# . 냐
# ..냐
# ../..냐
# ../../..냐
# 그럼 절대 경로를 쓰지 않으면서 $g4_path 를 구해보는게 순서 같습니다.
# 알면 쉽지만 모르면 어렵고...
# 사소하지만 암데나 index.php 를 만들어 봤습니다.
#
# ----------------------------------------------------------------
# 이상..삭제要.
?>
<?
#-아무 디렉토리에서나 페이지 작성이 가능한 Sample Page- 
####################################################
# 두가지 방법이 있습니다.
# G4가 설치된 디렉토리 안에서와 같은 계정의 상위나 동등한 위치에 있는
# 디렉토리에 G4에서 쓰실 파일을 만드시거나...
# 예를 들면
# g4_room/ 에 설치가되고
# g4_another_room/ 처럼 g4_room/에 g4가 설치되고  g4_another 방에 어떤
# 페이지를 만드시려면 아래에서 NO 를 YES 로 바꾸십시요.
# 그리고 g4가 설치된 방의 이름을 적어주십시요.
# g4 디렉토리내에서 사용하시려면 두줄을 막으시면 됩니다.
  $g4_another='NO';  //수정要
  $g4_dir='g4_another_room'; //위의 줄이 YES면 수정要. 마지막엔 / 슬래쉬 없습니다.
#
####################################################
$g4_now = $_SERVER['PHP_SELF'];
$g4_web = explode("/", $g4_now);
$g4_myname = array_pop($g4_web);
$g4_path_web = implode("/", $g4_web);
$g4_myurl = "http://".$_SERVER['HTTP_HOST'].$g4_path_web."/".$g4_myname;
$PAGE_BASE['www'] = $g4_myurl;
strstr( PHP_OS, "WIN") ? $g4_strPath = "\\" : $g4_str = "/";
$g4_path_file = getcwd ();
$PAGE_BASE['physical'] = $g4_path_file.$g4_str.$g4_myname;
$g4_www = $PAGE_BASE['www'];
$g4_physical = $PAGE_BASE['physical'];
####################################################
// echo "$g4_physical<p>"; // 물절주
// echo "$g4_www<p>";      // 웹절주
$g4_www = explode("/", $g4_www);
$g4_sz = sizeof($g4_www);

if($g4_another=='YES' && $g4_dir!='') 
 {$index_file=$g4_dir."/".'index.php';
  $_head_file=$g4_dir."/".'_head.php';
  $_com_file=$g4_dir."/".'_common.php';
 }else
 {$index_file='index.php';
  $_head_file='_head.php';
  $_com_file='_common.php';
 }
 for($g4_for=0; $g4_sz> $g4_for; $g4_for++){
 // 안아프게 배열에...넣어본다.
 // echo"$g4_www[$g4_for]</p>";
  if(file_exists($index_file)&&file_exists($_head_file)&& file_exists($_com_file))  
    {  if($g4_for==0) {$g4_sang='.'; break;}
  else{$g4_sang=str_replace("index.php","",$index_file);
  $g4_sang_length=strlen($g4_sang); //길이를 얻는다.
  $g4_sang=substr($g4_sang,0,$g4_sang_length-1);//처음부터 마지막 1자이전까지               
  break;}        
    }else{$index_file="../".$index_file;
          $_head_file="../".$_head_file;
  $_com_file="../".$_com_file;}              
}//for
######################################################
#밑의 꺽쇠와 그 다음 걱쇠사이는 공라인이 없어야 됩니다.
#위의 echo step인 물절주등을 테스트하려면 아래의 인클루드 _head.php 를 막으세요.
?>
<?
 $g4_path = $g4_sang;
 include_once("$g4_path/common.php");
 include_once("$g4[path]/lib/latest.lib.php");
 $g4[title] = "";
 include_once("$g4[path]/_head.php");
##########################################2005.12.10 dalsoo
?>

<!-- 홈피 시작합니다. -->
<table width="100%" cellpadding=0 cellspacing=0>
  <tr>
    <td align='center' valign=center  width='100%' height='480' bgcolor='003366'>
        <? #-----------------------------------------------------
//확인후 삭제 하십시요.
echo"
<font color='#FFFFFF'>여기가 바로 상대경로 루트 입니다...!!&nbsp;&nbsp;</font>
<font color='pink' size='5'> -->  &nbsp; $g4_sang</font><br>";
echo"
<font color='#DCDCDC' size='2'>
<br>이제 맘대로 방을 만들자...ㅋㅋ
<br>맘대로 page를 만들자.</font><br>
            <br><font color='#FFFFFF'>여기에  멋진 Page를 씁니다..!!!</font>";
#-----------------------------------------------------
?>
    </td>
  </tr>
 </table>


<!-- 메인화면 최신글 시작 -->
<table width="100%" cellpadding=0 cellspacing=0><tr><td valign=top>
<?
//  최신글
$sql = " select bo_table, bo_subject from $g4[board_table] order by gr_id, bo_table ";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++) {
    // 이 함수가 바로 최신글을 추출하는 역할을 합니다.
    // 스킨은 입력하지 않을 경우 관리자 > 환경설정의 최신글 스킨경로를 기본 스킨으로 합니다.
    // 사용방법
    // latest(스킨, 게시판아이디, 출력라인, 글자수);
    echo latest("basic", $row[bo_table], 5, 70);
    echo "<p>\n";
}
?>
</td></tr></table>
<!-- 메인화면 최신글 끝 -->


<script language="JavaScript" type="text/javascript">
function toggle(_s,_h) {
  if (document.all) {
    eval("document.all."+_s+".style.visibility='visible';");
    eval("document.all."+_h+".style.visibility='hidden';"); }
  else {
    if(navigator.userAgent.indexOf("Gecko")!=-1) {// is NS6 ?
      document.getElementById(_s).style.visibility='visible';
      document.getElementById(_h).style.visibility='hidden'; }
    else {
    eval("document.layers['"+_s+"'].visibility='show';");
    eval("document.layers['"+_h+"'].visibility='show';"); }
  }
}
</script>

<?
include_once("$g4[path]/_tail.php");
?>
</body>
추천
9
  • 복사

댓글 32개

스크랩과 동시에 추천도 날리고 감탄사도 연발해 봅니다.

단순한 '팁'이라고 하기 보다는 테크닉인데요.

왜냐면 체계적인 구조를 엿볼 수 있고,

설명 또한 적절하며, apm 사용자를 배려한 모습도 눈에 띄고...

정말 멋진 자료입니다.

뽀~~~쓰가 느껴집니다.
나스카님도..참...ㅡ.ㅡㅋ
일도 없고...걍 만들었습니다.
질문의 많은 부분이 경로문제..더군요..
미미님 신랑사이트에서 오신분은 많이 혼동하신듯..해서...
추천 감사..합니다. 기분이 죽음...^^;
저야 뭐 무지랭이라...
내용중에서 유일하게 알아보는 부분은...

// 물절주
// 웹절주
~ 뿐입니다.

아마도 플록님께서 보시면 '학구열'과 '열정'을 불사르실듯 합니다만~*^^*
한계입니다... 스크롤의 압박..
향학열이 불타야 될듯.. 사실 어케해야될지 전혀 감이 안옵니다.
여하튼 팁도 공개할려면 상당한 용기 + 지식이 있어야 하는데 대단하십니다.
정말 멋있는 팁 입니다. 그런데 아래 에러메시지는 어떻게 해결하나요.
Warning: Cannot modify header information - headers already sent by (output started at /home1/mymember/public_html/cart4/etc/g4_another.php:62) in /home1/mymember/public_html/cart4/head.sub.php on line 49

Warning: Cannot modify header information - headers already sent by (output started at /home1/mymember/public_html/cart4/etc/g4_another.php:62) in /home1/mymember/public_html/cart4/head.sub.php on line 51

Warning: Cannot modify header information - headers already sent by (output started at /home1/mymember/public_html/cart4/etc/g4_another.php:62) in /home1/mymember/public_html/cart4/head.sub.php on line 52

Warning: Cannot modify header information - headers already sent by (output started at /home1/mymember/public_html/cart4/etc/g4_another.php:62) in /home1/mymember/public_html/cart4/head.sub.php on line 53

Warning: Cannot modify header information - headers already sent by (output started at /home1/mymember/public_html/cart4/etc/g4_another.php:62) in /home1/mymember/public_html/cart4/head.sub.php on line 54

Warning: Cannot modify header information - headers already sent by (output started at /home1/mymember/public_html/cart4/etc/g4_another.php:62) in /home1/mymember/public_html/cart4/head.sub.php on line 55

에러가 나는 라인은 head.sub.php의
47 // 자바스크립트에서 go(-1) 함수를 쓰면 폼값이 사라질때 해당 폼의 상단에 사용하면
48 // 캐쉬의 내용을 가져옴. 완전한지는 검증되지 않음
49 header("Content-Type: text/html; charset=$g4[charset]");
50 $gmnow = gmdate("D, d M Y H:i:s") . " GMT";
51 header("Expires: 0"); // rfc2616 - Section 14.21
52 header("Last-Modified: " . $gmnow);
53 header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
54 header("Cache-Control: pre-check=0, post-check=0, max-age=0"); // HTTP/1.1
55 header("Pragma: no-cache"); // HTTP/1.0

입니다만..
1,이미 막아져 있는 test step 부분에 주석처리가 되었는데 그 부분을 풀지마시구요..
아래처럼..막아주세요.
// echo "$g4_physical<p>"; // 물절주
2,
#밑의 꺽쇠와 그 다음 걱쇠사이는 공라인이 없어야 됩니다.
#현재 $g4_sang 즉 상대주소를 구해서 $g4_path 에 할당을 하는데 공라인이 있으면
헤드.php에서 걸러집니다. 공라인이 있으면 안됩니다.
?>
<?
 $g4_path = $g4_sang;

3,또 혹시나 common.lib.php 의 제일마지막에 ?>  부터 마우스로 긁어보시면
공라인이 있을수도 있습니다. 선택후 지워주시면 됩니다..눈에 보이지는 않지만
head.php 에 적용된 header 함수는 이 함수 실행전에 어떠한 처리도 하지말라고 했는데
공백라인도 일종의 스트리밍으로 간주하기 때문입니다.
우와... 스페이스 한개가 엄청난 결과로군요.
올려주신 소스의
?>
<?
사이에 윗쪽에 스페이스 한개가 있었어요. 공라인이 아니고 스페이스 한개..
정말 엄청난 소스입니다.
index.php를 만들어 g4 바깥쪽의 아무 디렉토리에나 심어도 엿가락처럼 쩍쩍 달라 붙는군요.
대단히 요긴한 소스 감사합니다.
먼저 오달수님께 감사의 말씀드립니다.

나스카님께서 무지랭이라고 하시니 저같은 초보는 엄두를 못내고 포기하렵니다.
그래도 호기심 차원에서 한번 적용해봅니다.
기막힌 결과가 나오고 있습니다.

원본 g4 설치경로 http://www.gnusr.com/g4/
오달수님 소스코드로 작성된 index파일 작성위치 http://www.gnusr.com/gnu/index.php

이미 '탈 디렉토리'에 대한 논의가 '사이트 구조'라는 키워드로 고민된 흑적이 많이 남아있습니다만,
몇일 들여다 보면 뭔가 재미있는 응용사례가 만들어질것 같습니다.
이거 읽고 그냥 가면 안되겠습니다.
경로 관련글이라 꼼꼼하게 읽어봤는데 적용은 곧 오픈할 사이트에 해봐야 하겠습니다.

정말 수고하셨습니다.
^^
//pearly 님,izen님..읽어주셔서..고맙습니다.
//플록님..ㅋ 헤더를 탈없이 통과하는 방법..정도로 생각해 주세요..
적용이 되신다니..감개무량입니다...^^;
오달수님 앞으로도 활약 부탁드립니다.  그누사이트에 귀인이 나타나셨습니다. 오달수님이 주신 팁 얻어가는 재미가 쏠쏠합니다. 감사해요.
© SIRSOFT
현재 페이지 제일 처음으로