[Tatter1.0.?]루트에 설치된 태터에 배경음악 달기-28일재수정

28일자로 수정되었습니다. 수정된 내용은 최하단부분을 참조해주세요.

수시간에 걸친 삽질을 하면서 저녁먹는 와중에도 고민한 끝에 알아낸 방법을 그냥 알려드리겠습니다.

공유되지 않는 지식은 썩은 지식이다

※글주소가 숫자인 경우만 가능합니다.
->.htaccess를 잘 고쳐주신다면 제목인 경우에도 가능합니다.
※내부에서 다른 곳으로 새 창을 띄우지 않는 방법으로 페이지를 전환하면 아래에 배경음악 플레이어가 남겨진 채 상단프레임만 다른 페이지로 전환됩니다. 여기서 또 뒤로가기를 누르게 되면 플레이어가 2개가 중첩되어 로딩됩니다.
->블로그에서 외부로 연결되는 모든 링크(블로그의 즐겨찾기 링크 따위)를 모두 새 창으로 띄워지도록 합니다.

특징
이 방법으로 수정하게 되면 다른 방법으로 수정했을 때 나타나게 되는 favicon.ico나, 댓글 알리미 등의 장애, 트랙백, 코멘트 여닫힘 상태 적용되지 않는 등의 문제가 전혀 나타나지 않습니다.

비고
댓글 알리미, favicon.ico, index.gif 정상 작동 합니다.

원리는 대략 이러합니다.

루트나 /index.php로 들어오면 일단 /blog/index.php로 연결됩니다.
또한 /숫자 로 들어오는 경우에는 /blog/item.php로 연결됩니다.
프레임이 나눠지는 때는 딱 한 번이면 되고,
그 한 번은 다른 곳에서, 또는 직접 주소란에 주소를 기입해서 들어온 경우 뿐입니다.
바로 이겁니다.
리퍼러를 이용하면 되는 것입니다.
만일 리퍼러가 자신의 도메인이 아니라면 프레임을 나눈 페이지를 보내주고,
리퍼러가 자신의 도메인이라면 프레임이 나눠지지 않은 페이지를 보내주면 되는 것입니다.

수정방법

3가지 파일이 필요합니다.
.htaccess와 새로이 만들 frame.php와 mover.php
frame.php는 프레임이 나눠진 페이지이고,
mover.php의 역할은 나중에 설명해드리겠습니다.

루트에 보시면 .htaccess 라는 파일이 있습니다.
일단 이를 수정해야 합니다.

.htaccess
[시작 부분]
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:REDIRECT_SURI} !^$
RewriteRule (.*) - [L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [L]
RewriteRule ^$ blog/index.php [E=SURI:1,L]
RewriteRule ^[0-9]+$ blog/item.php [E=SURI:1,L]
RewriteRule ^favicon.ico$ blog/favicon.ico.php [E=SURI:1,L]
RewriteRule ^index.gif$ blog/index.gif.php [E=SURI:1,L]
RewriteCond %{QUERY_STRING} (^|&)pl=([0-9]+)
RewriteRule ^index.php$ %2 [NE,L]
RewriteRule ^index.php$ blog/index.php [E=SURI:1,L]
RewriteRule ^index.xml$ blog/rss/index.php [E=SURI:1,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d  
RewriteRule !^(blog|cache)/ - [L]      
RewriteRule ^(entry|attachment|category|keylog|tag|search|plugin)/? blog/$1/index.php [E=SURI:1,L]
RewriteRule ^(.+)/[0-9]+$ blog/$1/item.php [E=SURI:1,L]
RewriteRule ^(.+)$ blog/$1/index.php [E=SURI:1,L]

이것이 원본입니다.

이를 다음과 같이 고쳐줍니다.

[시작 부분]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} /throttle-me
RewriteRule (.*) - [L]
RewriteBase /
RewriteCond %{HTTP_REFERER} !.*eyesoft.co.kr.*
RewriteRule ^([0-9]*)$ frame.php?page=$1
RewriteCond %{HTTP_REFERER} !.*eyesoft.co.kr.*
RewriteRule ^$ frame.php?page=

RewriteCond %{ENV:REDIRECT_SURI} !^$
RewriteRule (.*) - [L]
[중략]

하이라이팅 된 곳이 새로이 추가된 구문입니다.

해석 들어갑니다.

RewriteCond %{HTTP_REFERER} !.*eyesoft.co.kr.*
=>리퍼러가 '머시깽이.eyesoft.co.kr머시깽이' 라면
RewriteRule ^([0-9]*)$ frame.php?page=$1
=>'/숫자'를 'frame.php?page=숫자'로 연결합니다.
RewriteCond %{HTTP_REFERER} !.*eyesoft.co.kr.*
=>리퍼러가 '머시깽이.eyesoft.co.kr머시깽이' 라면
RewriteRule ^$ frame.php?page=
=>''를 'frame.php?page='로 연결합니다.

그니깐 예를 들자면
eyesoft.co.kr로 들어온 경우에는 eyesoft.co.kr/frame.php?page=
eyesoft.co.kr/123은 eyesoft.co.kr/frame.php?page=123
과 같은 식으로 연결해주는 겁니다.

자신의 도메인에 적용하시는 경우에는
예를 들어 abc.com이면
!.*abc.com.*로 바꾸시면 됩니다.

!은 NOT 부정
.*은 없거나 다수의 글자
.은 그냥 .

작동 원리에 대해 이해가 안가셔도 무방하니 다음단계로

frame.php를 만들 차례입니다.

frame.php
[중략 : 이곳에는 <html>,<head>,<title>,<meta>등의 태그가 생략되어 있습니다.]
<frameset rows="*,20" frameborder=0 frame=0 border=0>
<frame src=mover.php?page=<? echo $_GET[page]; ?> scrolling="auto" marginwidth=0 noresize>
<frame src=bgm/sarangbi_bgm.php scrolling="no" marginwidth=0 noresize>
</frameset>
[중략]

딱 보시면 아시리라 믿습니다.
화면을 위아래로 나누고 위페이지는 원래의 블로그가, 아래 페이지에는 배경음악 플레이어가 들어갑니다.
여기에 php구문이 딱 한 구문 쓰였습니다. page파라메터로 받은 내용을 mover.php?page=쏼라 로 연결해줍니다.

사실 mover.php 따위는 필요도 없었습니다. 그러나 제가 이렇게 간단한 걸 두고 수시간동안 시간을 끈 것이 그 필요의 근거입니다.
리퍼러를 이용한 것임을 잊지 마시길 바랍니다. 분명 아래 프레임의 bgm/sarangbi.php의 경우에는 브라우져가 리퍼러를 보내주지만, 위 프레임의 경우에는(abc.com이나 abc.com/123식으로 들어왔을 경우) 리퍼러를 보내주지 않게 됩니다. 따라서 만일 상위 프레임을 <frame src=<? echo $_GET[page]; ?> [중략 : 다른 속성]>으로 했을 경우에는 리퍼러가 외부임으로 간주되기 때문에 아까 수정한 .htaccess에서 우리가 추가한 구문에 계속 걸리게 됩니다. 따라서 mover.php의 역할은 리퍼러를 만들어주는 역할일 뿐입니다.

mover.php의 내용입니다.

mover.php
<script>
location.href="<? echo $_GET[page]; ?>";
</script>
아주 간단합니다. 들어오자마자 page파라메터로 받은 값으로 돌려버립니다. 뭔가 아시는 분이라면 meta 태그로 refresh해도 되지 않겠느냐 라고 의문을 가지실지도 모르겠지만, meta 태그로 refresh한 경우에는 리퍼러를 보내지 않기 때문에 무한 루프에 빠지게 됩니다.


-예를 통하여 실제 적용시 어떤 작동을 하는지 알아봅시다.

1.eyesoft.co.kr로 주소창에 직접 타이핑해서 들어오거나 다른 곳의 링크를 통해 접속합니다.
-리퍼러는 외부이기 때문에 RewriteRule에 의해 eyesoft.co.kr/frame.php?page=로 연결됩니다.
-브라우져가 프레임을 나누고 각 프레임에 해당하는 페이지를 요청합니다.
-먼저 상단 프레임에 해당하는 페이지인 eyesoft.co.kr/mover.php?page=을 요청합니다.
-mover.php의 스크립트 구문에 의해 eyesoft.co.kr/로 연결됩니다.
-리퍼러가 eyesoft.co.kr/mover.php이기 때문에 우리가 추가한 구문을 거치지 않고 넘어갑니다.
-블로그 메인페이지가 상위프레임에 로드되었습니다.
-하단프레임에 해당하는 페이지를 불러옵니다.
-끝

2.eyesoft.co.kr/13으로 1번과 같은 경우로 접속해옵니다.
-리퍼러가 외부이므로 eyesoft.co.kr/frame.php?page=13으로 연결됩니다.
-브라우져가 프레임을 나누고 상단 프레임에 해당하는 페이지인 eyesoft.co.kr/mover.php?page=13을 요청합니다.
-리퍼러가 eyesoft.co.kr/mover.php이기 때문에 넘어갑니다.
-13번 글이 로드됩니다.
-하단프레임에 해당하는 페이지를 불러옵니다.
-끝

3.프레임이 나눠진 상태에서 블로그페이지에서 eyesoft.co.kr로 연결된 링크를 통해 접속해옵니다.
-리퍼러가 아까와는 다르게 내부이므로 우리가 추가한 구문을 무시하고 넘어갑니다.
-블로그 메인페이지가 로드되었지만 상단프레임에만 적용됩니다.
-끝

4.프레임이 나눠진 상태에서 블로그페이지에서 eyesoft.co.kr/13으로 연결된 링크를 통해 접속해옵니다.
-역시 리퍼러가 내부이므로 넘어갑니다.
-13번 글이 로드되었지만 역시 상단프레임에만 적용됩니다.
-끝

자 이제 이 파일들을 모두 루트에 올려줍시다.

29일자 수정안
파이어폭스가 mover.php의 location.href='./'를 실행함으로써 루트페이지를 요청하는 과정에서 브라우져가 Referer를 전송하지 않아 무한 리프레시에 빠지는 문제가 발견되었습니다. 서버 과부하와 관련될 수 있으니 즉각 수정바랍니다.

세부정보
Referer대신 Cookie를 사용합니다. 개인 정보 설정에서 쿠키 허용을 보통으로 하시면 됩니다.(물론 그 이하도 가능합니다.)
불안했던 임시의 mover.php가 더 이상 사용되어지지 않습니다. 단, rewritemodule에서 그 작동이 대신 구현됩니다. mover.php는 바로 삭제해주시기 바랍니다.

다음과 같이 고칩니다.
.htaccess
[전문입니다. .htaccess 시작]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} /throttle-me
RewriteRule (.*) - [L]
RewriteBase /

RewriteCond %{HTTP_COOKIE} !(.*)temp=yes(.*) [NC,OR]
RewriteCond %{HTTP_REFERER} !.*eyesoft.co.kr.* [NC]
RewriteRule ^([0-9]*)$ frame.php?view=$1 [L]

RewriteCond %{HTTP_COOKIE} (.*)temp=yes(.*) [NC]
RewriteCond %{HTTP_REFERER} .*eyesoft.co.kr.* [NC]
RewriteCond %{REQUEST_URI} ^/mover.php [NC]
RewriteCond %{QUERY_STRING} ^[.*&]?view=([0-9]*)[&.*]?&referer=(.*)
RewriteRule (.*) %1? [E=HTTP_REFERER:%2,R,L]

RewriteCond %{REQUEST_URI} ^/mover.php [NC]
RewriteCond %{HTTP_REFERER} !.*eyesoft.co.kr.* [NC]
RewriteRule (.*) - [F]

RewriteCond %{ENV:REDIRECT_SURI} !^$
RewriteRule (.*) - [L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [L]
RewriteRule ^$ blog/index.php [E=SURI:1,L]
RewriteRule ^[0-9]+$ blog/item.php [E=SURI:1,L]
RewriteRule ^favicon.ico$ blog/favicon.ico.php [E=SURI:1,L]
RewriteRule ^index.gif$ blog/index.gif.php [E=SURI:1,L]
RewriteCond %{QUERY_STRING} (^|&)pl=([0-9]+)
RewriteRule ^index.php$ %2 [NE,L]
RewriteRule ^index.php$ blog/index.php [E=SURI:1,L]
RewriteRule ^index.xml$ blog/rss/index.php [E=SURI:1,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d  
RewriteRule !^(blog|cache)/ - [L]      
RewriteRule ^(entry|attachment|category|keylog|tag|search|plugin)/? blog/$1/index.php [E=SURI:1,L]
RewriteRule ^(.+)/[0-9]+$ blog/$1/item.php [E=SURI:1,L]
RewriteRule ^(.+)$ blog/$1/index.php [E=SURI:1,L]
[.htaccess 끝]

frame.php
[중략 : 이곳에는 <html>,<head>,<title>,<meta>등의 태그가 생략되어 있습니다.]
<frameset rows="*,20" frameborder=0 frame=0 border=0>
<frame src="mover.php?view=<?=$_GET[view];?>&referer=<?=$_GET[referer];?>" scrolling="auto" marginwidth=0 noresize>
<frame src=bgm/sarangbi_bgm.php scrolling="no" marginwidth=0 noresize>
</frameset>
[중략]

<끝>

제가 중학생인지라 내일 기말고사인데, 요놈 고치느라 시간 다 보내버렸으니 어쩔까요? OTL
: 2006-06-2610:20:57 : X
올려주신 방법으로 잘 쓰고 있습니다. 감사합니다. 그런데 이전 것에서 뭐가 수정된거죠?
kara : 2006-06-2714:30:24 : X
.htaccess 부분 새로 사입된 것은 삽입된 것이고 본래 있던 것들이 순서바 바뀌었는데 어떻게 삽입해야 하는지 헷갈립니다. 수정된 .htaccess 전문을 올려주세요.
김정기 : 2006-06-2720:34:11 :
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} /throttle-me
RewriteRule (.*) - [L]
RewriteBase /
RewriteCond %{HTTP_REFERER} !.*eyesoft.co.kr.*
RewriteRule ^([0-9]*)$ frame.php?page=$1
RewriteCond %{HTTP_REFERER} !.*eyesoft.co.kr.*
RewriteRule ^$ frame.php?page=
RewriteCond %{ENV:REDIRECT_SURI} !^$
RewriteRule (.*) - [L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [L]
RewriteRule ^$ blog/index.php [E=SURI:1,L]
RewriteRule ^[0-9]+$ blog/item.php [E=SURI:1,L]
RewriteRule ^favicon.ico$ blog/favicon.ico.php [E=SURI:1,L]
RewriteRule ^index.gif$ blog/index.gif.php [E=SURI:1,L]
RewriteCond %{QUERY_STRING} (^|&)pl=([0-9]+)
RewriteRule ^index.php$ %2 [NE,L]
RewriteRule ^index.php$ blog/index.php [E=SURI:1,L]
RewriteRule ^index.xml$ blog/rss/index.php [E=SURI:1,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^(blog|cache)/ - [L]
RewriteRule ^(entry|attachment|category|keylog|tag|search|plugin)/? blog/$1/index.php [E=SURI:1,L]
RewriteRule ^(.+)/[0-9]+$ blog/$1/item.php [E=SURI:1,L]
RewriteRule ^(.+)$ blog/$1/index.php [E=SURI:1,L]
김정기 : 2006-06-2720:34:34 :
이게 전문입니다. 위에서 5번째 행부터 8행까지 입니다.
안성용 : 2006-06-2721:27:31 : X
음 감사합니다.

제대로 한건지 모르겠네요 ?

http://blog.ittl.net
김정기 : 2006-06-2723:37:20 :
안성용님//넵 잘 적용하셨습니다.
kara : 2006-06-2803:01:50 : X
감사합니다.
AmoredCore : 2006-06-2811:30:06 : X
이렇게 유용한것을.....
좀 빠릴 올려주시지..ㅡㅜ
여튼 덕분에 좋은 정보 감사합니다...
지금 바로 뜯어 고쳐야징~~룰루랄라~♪
Luneverte : 2006-06-2812:01:52 :
firefox에서 그 사이트 자체에 접속이 안되는 현상이 일어납니다a
김정기 : 2006-06-2819:53:24 :
저도 며칠전에 그 문제점을 파악하고 지금 수정본을 작성 중입니다.
질문요 : 2006-06-3000:33:57 : X
태터툴즈를 루트가 아닌
/tt/ 폴더에 설치했을경우에는 어떻게 해야 하나요..
... : 2006-07-0116:28:24 : X
물론 딴지인건 알지만, 왜 배경음악을 달려고 하는지 알 수가 없어요.
링크 타고 블로그 열려다가도 음악 로딩 걸리거나 짱나는 노래 나오면 포스트 읽고 싶지도 않던데.
ash12120 : 2006-07-0216:55:14 : X
...님//다른분들은 모르겠지만 제딴엔 자기만족입니다.^^;
어라 : 2006-07-0318:25:18 : X
혹시 이거 리퍼러 로그 문제 있지 않나요? 이거 하고 나서 리퍼러 로그가 작동 불능 되는 것 같습니다.
Lunik : 2006-07-0721:48:58 : X
질문요//

테터를 하위 디렉토리에 설치했을 경우는 쉽습니다.

루트에 인덱스 파일을 만들어서

프레임을 나눠주면 되죠..
http://www.tattertools.com/ko/bbs/view.php?id=plugin&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=bgm&select_arrange=headnum&desc=asc&no=219