(삭제됨)
(삭제됨)
2024.08.23 - 최근에는 대부분의 사이트는 다른 도메인 내의 frame내에서 표시되는 것을 거부하고 있어서 사용성이 극히 떨어짐. 코드에서 삭제함
#EXTERN 명령어 추가
- 하나의 페이지 내부에 외부의 웹페이지를 그대로 가져오는 명령어
- 사용법 - #EXTERN URL
- 페이지 제일 처음에 적어야 한다.
- URL 은 일반적인 형식 (프로토콜://주소) 에 맞춰 적는다.
- 2단 프레임을 만들어 상단 프레임에는 페이지 제목과 메뉴바가, 하단 프레임에는 URL 에 해당하는 웹 페이지가 출력된다.
- 환경변수
- $EditGuideInExtern - EXTERN 을 사용한 페이지 하단에 편집 가이드를 출력할 것인지를 지정한다.
- 1 - 하단에 별도의 프레임을 두어 편집 가이드를 출력한다.
- 0 - 출력하지 않는다.
- 출력할 경우, 상단과 하단을 합쳐서 300 pixel 정도를 차지하게 되므로, 해상도가 낮은 화면에서 볼 때 불편할 수 있다. 0 을 권장
- 사이트마다 로고 이미지의 크기나 스타일쉬트의 차이 때문에 아래의 두 변수를 적절히 조절해 주어야 한다.
- $SizeTopFrame - 첫번째 프레임의 높이, pixel 단위
- $SizeBottomFrame - 세번째 프레임 (편집 가이드를 출력할 경우) 의 높이, pixel 단위
- 부작용
- 프레임을 사용하게 된다. 프레임을 지원하지 않는 브라우저에서는 보이지 않는다.
- 지저분한 소스코드 :-/
- 2002.12.5 - 상,하단 프레임에 들어가는 html 소스가 제대로 </body></html> 가 붙지 않는 것을 수정
-
use vars qw(@RcDays @HtmlPairs @HtmlSingle
...
### 환경변수 추가
$EditGuideInExtern $SizeTopFrame $SizeBottomFrame);
-
$EditGuideInExtern = 0;
$SizeTopFrame = 160;
$SizeBottomFrame = 110;
-
sub BrowsePage {
...
} else {
$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|/.*||;
...
}
-
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><</html>html<html>></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><</html>/html<html>></html>\n";
return;
}
}
-
sub GetHeader {
...
return $result if ($embed);
return $result if (&GetParam('InFrame','') eq '2');
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);
}
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 {
...
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
이걸 사용하면 다 좋은데 포함된 페이지가 쿠키를 사용하는 경우 쿠키가 적용되지 않더군요. 거북방명록 을 보세요. 먼저 가입을 한 다음에 방명록 작성해보시면 상황파악이 되실겁니다. 그런데 이거는 조금 근본적인 문제가 아닌가 싶네요. --
거북이 2003-2-12 11:33 pm
- 음 전 쿠키 잘 되던데요. 다만 원래 쿠키라는 것이 서로 다른 사이트일 때는 따로 돌아갑니다. www.jof4002.net과 jof4002.net이 다른 쿠키가 생기죠. 프레임 안에서 부를 때는 그 프레임의 주소를 기준으로 쿠키가 생기나요? 그러면 koreanrock.com과 musicisland.org가 각각 다른 쿠키가 생긴다고 가정할 수 있겠네요. 아니면 원래 다른 사이트에 포함된 페이지는 쿠키 적용이 제대로 안된다거나? 잘 아시는 분이 답변해주셨으면합니다.
- "문제점"이라고 헤드라인을 다셨는데 진짜 문제인지도 분명치 않은터라 ;-) 헤드라인 제목을 바꿨습니다. 그리고 쿠키는 저도 지금까지는 문제를 발견한 적이 없습니다만, 좀 더 살펴봐야겠죠. 저도 쿠키나 cgi 의 기본적인 사항 자체에 대해서 잘 알지 못하는터라..
- 링크 걸어주신 거북방명록에 가 보았습니다. 말씀하신 문제란 것이... "sign in 을 하여 아이디와 이름, 메일 주소를 설정하고 확인한 후에, 로그인을 하면, 상단에 입력창에 이미 이름과 주소 등이 나와 있어야 하는데 나오지 않고 있다"라는 것인가요? (저는 상황파악이 안 되던데요.. 우리 모두 상황 설명은 친절히 하는 습관을 들이도록 합시다 ^^) 암튼 문제가 그것이라면... extern 을 쓰지 않고 브라우저를 따로 열어 musicisland.org 의 방명록 자체를 열어봐도 안 되긴 마찬가지던데요? 일단 한 번 글을 쓰고 나니 그 다음부터는 되는군요. 오히려, 로그아웃을 한 후에도 여전히 작성자 이름과 메일주소는 쿠키에 남아 있네요. 여기까지 테스트해 본 바로는 아무리 봐도 방명록 프로그램의 문제이지 EXTERN 하고는 관계가 없는 게 아닐까 하는... (확신이 없어서 말꼬리 흐림 ^^;)
앗 상황을 좀 더 자세히 적을께요. ^^ 일단 ID를 만들고 로그인을 하면 페이지 열때마다 로그인을 할 것인지 로그아웃을 하기 전까지 로그인 되어있는 상황으로 놔둘 것인지를 물어보는 창이 뜹니다. 그때 확인 버튼을 누르면 계속 로그인 상태로 남아있는데요. 이게 브라우저를 닫았다가 다시 접근해보면 로그아웃 된 상태로 된다는 거죠.
제 예상은 그 게시판 페이지에서는 자기 URL을 참고하여 쿠키를 적용하는데 EXTERN 내부에 포함되어있으면 URL이 자기 것이 아니므로 쿠키를 잘 못읽어 오는 것이 아닐까 하고 생각되네요. 그렇다면 어쩌면 여기서 소스를 수정해도 해결할 수는 없다는 결론이 나오는게 아닌가 싶어 근본적인 문제인것 같다는 말을 적은 거랍니다.
다음부턴 좀 더 확실한 리포팅을 할께요. ^^
- 그 얘기였군요.. 제깍 알아차리지 못해서 죄송합니다 ^^ 그런데, 위키에 포함하지 않고, 그 방명록 자체의 주소 ( http://musicisland.org/zboard/zboard.php?id=TortGuestBook ) 를 직접 브라우저에 적어서 똑같이 테스트해 보셨나요? 제가 해 봤을 때는 역시 동일한 문제가 발생하던데요... 그러니 어쨌거나 위키의 잘못은 아니라고 생각됩니다. 게다가 EXTERN 이 하는 것은 결국 프레임을 나누고 상단에는 자기 자신을 재귀적으로 호출하고 하단 프레임에는 외부 주소를 가져오는 것인데.. (결국 사람이 frame 태그를 html 화일에 적어준 것과 동일합니다) 설마 방명록 프로그램이 자기가 그냥 불리는지 프레임 안에서 불리는 지를 판단하고 있다고는 생각되지 않습니다. (그게 기술적으로 가능한지도 모르겠지만)
- 좀 이상한 것이. 저도 Raymundo님이 말씀하신 것처럼, 가입하고 로그인하면서 자동 로그인 체크하고, 창 닫은다음에 다시 열면, 로그인이 안된 것처럼 나옵니다. 하지만 이 상태에서 다시 가입하려고 하면, 이미 가입되어있다는 에러 메시지가 나오는군요. 그리고 결정적으로 그 상태에서 F5를 눌러주면 로그인된 상태로 나옵니다. 자동 로그인 기능 자체는 동작하는 것 같네요. 오히려 스킨(또는 제로보드?)쪽에서 자동로그인 처리를 제대로 못하고 있는게 아닐까 싶습니다. http://clien.net 같은 사이트에서는 자동로그인 처리가 제대로 되는 것으로 봐서 스킨 문제가 아닐까 싶네요. 제가 제로보드를 잘 몰라서 더 이상은 모르겠네요.
- Is not there FooterText here? [UseModWiki소스수정/TestExtern] --JuanmaMP
- Other matter: maybe, it will be considered a bug from UseModWiki 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!
위키위키분류