[첫화면으로]UseModWiki소스수정/EXTERN명령어

마지막으로 [b]

(삭제됨)

(삭제됨)

2024.08.23 - 최근에는 대부분의 사이트는 다른 도메인 내의 frame내에서 표시되는 것을 거부하고 있어서 사용성이 극히 떨어짐. 코드에서 삭제함

#EXTERN 명령어 추가

use vars qw(@RcDays @HtmlPairs @HtmlSingle
    ...
### 환경변수 추가
    $EditGuideInExtern $SizeTopFrame $SizeBottomFrame);
### wiki.pl 에 기본값을 적어주고, config.pl 에서 별도로 설정한다.
$EditGuideInExtern = 0; # 1 = show edit guide in bottom frame, 0 = don't show
$SizeTopFrame = 160;
$SizeBottomFrame = 110;
sub BrowsePage {
    ...
        } else {  # Not a valid target, so continue as normal page
            $id = $oldId;
            $oldId = '';
        }
    }
### 다음 단락 추가
    if (substr($Text{'text'}, 0, 8) eq '#EXTERN ') {
        $oldId = &GetParam('oldid', '');
        my ($externURL) = ($Text{'text'} =~ /\#EXTERN\s+([^\s]+)/);
        if ($externURL =~ /^$UrlPattern$/) {
            &BrowseExternUrl($id, $oldId, $externURL);
            return;
        }
    }
### 여기까지
    $MainPage = $id;
    $MainPage =~ s|/.*||;  # Only the main page name (remove subpage)
    ...
}
### 다음 함수를 통채로 추가
sub BrowseExternUrl {
    my ($id, $oldId, $url) = @_;
    my $sizeBottomFrame = $SizeBottomFrame * $EditGuideInExtern;

    if (&GetParam('InFrame','') eq '1') {
        print &GetHeader($id, "$id [InTopFrame]",$oldId);
        print &GetMinimumFooter();
        return;
    } elsif ((&GetParam('InFrame','') eq '2') && ($EditGuideInExtern)) {
        print &GetHeader($id, "$id [InBottomFrame]",$oldId);
        print "<hr>\n";
        print &GetEditGuide($id, '');
        print &GetMinimumFooter();
        return;
    } else {
        print &GetHttpHeader();
        print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">\n";
        print "<html>&lt;</html>html<html>&gt;</html>\n";
        print "<title>$SiteName: $id</title>\n";
        print "<frameset rows=\"$SizeTopFrame,*,$sizeBottomFrame\" cols=\"1\" frameborder=\"0\">\n";
        print "  <frame src=\"$ScriptName?action=browse&InFrame=1&id=$id&oldid=$oldId\" noresize>\n";
        print "  <frame src=\"$url\" noresize>\n";
        print "  <frame src=\"$ScriptName?action=browse&InFrame=2&id=$id&oldid=$oldId\" noresize>\n" if ($EditGuideInExtern);
        print "  <noframes>\n";
        print "  <body>\n";
        print "  <p>".T('You need the web browser which supports frame tag.')."\n";
        print "  </body>\n";
        print "  </noframes>\n";
        print "</frameset>\n";
        print "<html>&lt;</html>/html<html>&gt;</html>\n";
        return;
    }
}
sub GetHeader {
    ...
    return $result  if ($embed);
### 다음 라인 추가
    return $result if (&GetParam('InFrame','') eq '2');
### 여기까지

### 다음 단락 수정
#   if ($oldId ne '') {
#       $result .= $q->h3('(' . Ts('redirected from %s',
#                                                            &GetEditLink($oldId, $oldId)) . ')');
#   }

    my $topMsg = "";
    if ($oldId ne '') {
        $topMsg .= '('.Ts('redirected from %s',&GetEditLink($oldId, $oldId)).')  ';
    }
    if (&GetParam('InFrame','') eq '1') {
        $topMsg .= '('.Ts('%s includes external page',&GetEditLink($id,$id)).')';
    }
    $result .= $q->h3($topMsg) if (($oldId ne '') || (&GetParam('InFrame','') eq '1'));
### 여기까지
    if ((!$embed) && ($LogoUrl ne "")) {
    ...
    } else {
        $result .= $q->h1($header . $title);
    }
### 아래는 "페이지 상단에 Alt+Z 할당" 패치에서 추가한 부분이다. 
### 그 패치를 적용하지 않았다면 아래 단락은 무시해도 된다.
    if (&GetParam('InFrame','') eq '') {
        $result .= "\n<div align=\"right\"><a accesskey=\"z\" name=\"#PAGE_TOP\" href=\"#PAGE_BOTTOM\">".T('Bottom') . "</a></div>\n";
    }
### 여기까지
    if (&GetParam("toplinkbar", 1)) {
    ...
}
sub GetHtmlHeader {
    ...
### 다음 단락 교체
    # added luke
#   if ($ClickEdit) {
#       if ($FreeLinks) {
#           $id = &FreeToNormal($id);
#       }
#       $bodyExtra .= qq(ondblclick="location.href='$ScriptName?action=edit&id=$id'");
#   }
    # end

    if (&GetParam('InFrame','') ne '') {
        $html .= qq(<base target="_parent">\n);
    } else {
        if ($ClickEdit) {
            if ($FreeLinks) {
                $id = &FreeToNormal($id);
            }
            $bodyExtra .= qq(ondblclick="location.href='$ScriptName?action=edit&id=$id'");
        }
    }
### 여기까지
    ...
}
sub GetMinimumFooter {
### 다음 단락 추가
    if (&GetParam('InFrame','') ne '') {
        return $q->end_html;
    }
###
    ...
}

Notes

이걸 사용하면 다 좋은데 포함된 페이지가 쿠키를 사용하는 경우 쿠키가 적용되지 않더군요. KRock:거북방명록 을 보세요. 먼저 가입을 한 다음에 방명록 작성해보시면 상황파악이 되실겁니다. 그런데 이거는 조금 근본적인 문제가 아닌가 싶네요.
-- 거북이 2003-2-12 11:33 pm
음 전 쿠키 잘 되던데요. 다만 원래 쿠키라는 것이 서로 다른 사이트일 때는 따로 돌아갑니다. www.jof4002.net과 jof4002.net이 다른 쿠키가 생기죠. 프레임 안에서 부를 때는 그 프레임의 주소를 기준으로 쿠키가 생기나요? 그러면 koreanrock.com과 musicisland.org가 각각 다른 쿠키가 생긴다고 가정할 수 있겠네요. 아니면 원래 다른 사이트에 포함된 페이지는 쿠키 적용이 제대로 안된다거나? 잘 아시는 분이 답변해주셨으면합니다.
-- 조프 2003-2-13 12:19 am

"문제점"이라고 헤드라인을 다셨는데 진짜 문제인지도 분명치 않은터라 ;-) 헤드라인 제목을 바꿨습니다. 그리고 쿠키는 저도 지금까지는 문제를 발견한 적이 없습니다만, 좀 더 살펴봐야겠죠. 저도 쿠키나 cgi 의 기본적인 사항 자체에 대해서 잘 알지 못하는터라..
-- Raymundo 2003-2-13 12:28 am

링크 걸어주신 거북방명록에 가 보았습니다. 말씀하신 문제란 것이... "sign in 을 하여 아이디와 이름, 메일 주소를 설정하고 확인한 후에, 로그인을 하면, 상단에 입력창에 이미 이름과 주소 등이 나와 있어야 하는데 나오지 않고 있다"라는 것인가요? (저는 상황파악이 안 되던데요.. 우리 모두 상황 설명은 친절히 하는 습관을 들이도록 합시다 ^^) 암튼 문제가 그것이라면... extern 을 쓰지 않고 브라우저를 따로 열어 musicisland.org 의 방명록 자체를 열어봐도 안 되긴 마찬가지던데요? 일단 한 번 글을 쓰고 나니 그 다음부터는 되는군요. 오히려, 로그아웃을 한 후에도 여전히 작성자 이름과 메일주소는 쿠키에 남아 있네요. 여기까지 테스트해 본 바로는 아무리 봐도 방명록 프로그램의 문제이지 EXTERN 하고는 관계가 없는 게 아닐까 하는... (확신이 없어서 말꼬리 흐림 ^^;)
-- Raymundo 2003-2-13 12:35 am

앗 상황을 좀 더 자세히 적을께요. ^^ 일단 ID를 만들고 로그인을 하면 페이지 열때마다 로그인을 할 것인지 로그아웃을 하기 전까지 로그인 되어있는 상황으로 놔둘 것인지를 물어보는 창이 뜹니다. 그때 확인 버튼을 누르면 계속 로그인 상태로 남아있는데요. 이게 브라우저를 닫았다가 다시 접근해보면 로그아웃 된 상태로 된다는 거죠.
제 예상은 그 게시판 페이지에서는 자기 URL을 참고하여 쿠키를 적용하는데 EXTERN 내부에 포함되어있으면 URL이 자기 것이 아니므로 쿠키를 잘 못읽어 오는 것이 아닐까 하고 생각되네요. 그렇다면 어쩌면 여기서 소스를 수정해도 해결할 수는 없다는 결론이 나오는게 아닌가 싶어 근본적인 문제인것 같다는 말을 적은 거랍니다.
다음부턴 좀 더 확실한 리포팅을 할께요. ^^
-- 거북이 2003-2-13 1:36 pm

그 얘기였군요.. 제깍 알아차리지 못해서 죄송합니다 ^^ 그런데, 위키에 포함하지 않고, 그 방명록 자체의 주소 ( http://musicisland.org/zboard/zboard.php?id=TortGuestBook ) 를 직접 브라우저에 적어서 똑같이 테스트해 보셨나요? 제가 해 봤을 때는 역시 동일한 문제가 발생하던데요... 그러니 어쨌거나 위키의 잘못은 아니라고 생각됩니다. 게다가 EXTERN 이 하는 것은 결국 프레임을 나누고 상단에는 자기 자신을 재귀적으로 호출하고 하단 프레임에는 외부 주소를 가져오는 것인데.. (결국 사람이 frame 태그를 html 화일에 적어준 것과 동일합니다) 설마 방명록 프로그램이 자기가 그냥 불리는지 프레임 안에서 불리는 지를 판단하고 있다고는 생각되지 않습니다. (그게 기술적으로 가능한지도 모르겠지만)
-- Raymundo 2003-2-13 10:59 pm

좀 이상한 것이. 저도 Raymundo님이 말씀하신 것처럼, 가입하고 로그인하면서 자동 로그인 체크하고, 창 닫은다음에 다시 열면, 로그인이 안된 것처럼 나옵니다. 하지만 이 상태에서 다시 가입하려고 하면, 이미 가입되어있다는 에러 메시지가 나오는군요. 그리고 결정적으로 그 상태에서 F5를 눌러주면 로그인된 상태로 나옵니다. 자동 로그인 기능 자체는 동작하는 것 같네요. 오히려 스킨(또는 제로보드?)쪽에서 자동로그인 처리를 제대로 못하고 있는게 아닐까 싶습니다. http://clien.net 같은 사이트에서는 자동로그인 처리가 제대로 되는 것으로 봐서 스킨 문제가 아닐까 싶네요. 제가 제로보드를 잘 몰라서 더 이상은 모르겠네요.
-- 조프 2003-2-14 11:25 am

Is not there FooterText here? [UseModWiki소스수정/TestExtern] --JuanmaMP
Other matter: maybe, it will be considered a bug from UseModWiki UseMod:WikiBugs/RedirectFromNonExistentPage --JuanmaMP

Oh... EXTERN directive is implemented using "frameset" and "frame" tags, which are very old style. Modern browsers seem to refuse to render it for security. I'll consider another way to show external webpage. Thank you!
-- Raymundo 2013-2-2 3:17 pm


위키위키분류

마지막 편집일: 2024-8-25 12:32 am (변경사항 [d])
1737 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기