[web] 고정ip와 ddns를 이용하여 웹서비스 시 페이지 띄워주기 (apache redirect 사용)

(0. 배경)
먼저 기존에 포스팅 했던 글을 참고 바란다.
(관련글 : [web] 고정ip와 ddns를 이용하여 웹서비스 시 첫페이지에서 구분해서 띄워주기 )
위 글에서는.. 처음 접속할때 첫페이지에서 ddns를 이용한 ip가 살았으면 그쪽도메인(test.ddns.com)으로 연결하고,
아니면 그냥 고정ip 도메인(www.test.com)으로 연결하도록 하는 팁(꼼수)였다.

(1. 문제점)
뭐.. 그럭저럭 잘 사용하고 있었다..
그런데.. 한가지 문제가 발견됐다..
포스팅을 하다 보면.. 게시물 주소라던가.. 트랙백 등.. 외부로 노출해야되는 주소가 있는데..
접속하는 도메인에 따라서.. test.ddns.com/xe/어쩌구저쩌구 혹은 www.test.com/xe/어쩌구저쩌구 하는 식으로 나오는것이다.
(실제 현사이트에는 www.heyo.net/xe/… 혹은 www1.heyo.net/xe/… 하는 식으로 나왔다)
동일한 글이 다른주소를 가지게되는건 싫어서..
또 ddns도메인(test.ddns.com)은 서비스가 안될경우도 있기때문에.. 고정적인 도메인이 출력되길 원했다.
해서.. 소스를 좀 수정해서.. http://test.com/xe/어쩌구저쩌구 하는식으로 출력되도록 수정은 했는데..
이게 문제가.. test.com으로 가게되면 고정ip로 가기때문에 속도가 느리다는 것이다..

(2. 해결방안)
그래서.. 생각한게.. 어차피 첫페이지에서 ddns살았나 죽었나를 판단하니..
이걸 첫페이지에서만 할게 아니라.. 모든페이지에서 판단하면 되지 않겠나..
외부링크는 무조건 test.com 으로 걸고.. test.com 에서 판단해서.. www.test.com이나 test.ddns.com 으로 돌려주면 되지 않겠나..했다.
처음엔.. Redirect 사용법을 잘 몰라서 좀 해맸는데…
일단 돌아가게 해놨다.. 얼마간 두고보면.. 이상있는지 없는지 알게 되겠지..

(3. 결과물)
http.conf의 VirtualHost 부분을 다음과 같이 나눈다.
============
<VirtualHost *:80>
    ServerAdmin admin@localhost
    DocumentRoot /var/www/redir_html      # <– test.net으로 들어온건 판단해서 redirect 시킨다.
    ServerName test.net
    ErrorLog logs/redir.test.com-error_log
    CustomLog logs/redir.test.com-access_log common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin admin@localhost
    DocumentRoot /var/www/test_html
    ServerName www.test.com           # <– 고정 ip용 도메인
    ServerAlias test.ddns.com          # <– ddns용 도메인
    ErrorLog logs/test.com-error_log
    CustomLog logs/test.com-access_log common
</VirtualHost>
============

/var/www/redir_html 에는 다음과 같은 파일을 놔둔다..
① apache redirect 를 위해 htaccess를 수정(혹은 생성)한다.
내용은.. 실제로 존재하는 2개 파일을 제외하곤 모두 redir.php로 보내서.. 처리하겠다는 내용이다.
# vi .htaccess
============
RewriteEngine on

RewriteCond %{REQUEST_URI} !/redir.php$
RewriteCond %{REQUEST_URI} !/pagealivecheck.js$
RewriteRule ^(.*)$ redir.php
============

② 실제로 redirect를 실행하는 php.
(기존 포스팅의 index.php를 조금 수정해서 사용했다.  기존에 redirect할 url을 $start_page로 고정했던걸 $req_uri로 수정한 정도..?)
# vi redir.php
============
<?php
    $req_host = “www.test.com”;         // 원 호스트(고정 ip, 저속)
    $mod_host = “test.ddns.com”;        // 수정 호스트(ddns, 고속)
    $req_uri = $_SERVER[“REQUEST_URI”];   // 연결할 URL

    $test_page=”/pagealivecheck.js”;    // 살아있는지 확인 b_page_alive = ture;
?>
<html>
<head>
<script language=’JavaScript’>
<!–
    var b_page_alive = false;

function goStartPage()
{
        if(b_page_alive)
                document.location = “http://<?=$mod_host.$req_uri?>”;
        else
                document.location = “http://<?=$req_host.$req_uri?>”;
}

setTimeout(“goStartPage();”,3000);
//–>
</script>
<script type=”text/javascript” src=”“>http://<?=$mod_host.$test_page?>”></script>
<meta http-equiv=”refresh” content=”5; url=http://<?=$req_host.$req_uri?>”>
</head>
<body onload=’goStartPage()’>
</body>
</html>
============

③ 그리고.. 살았는지 판단해줄 js파일.. (기존이랑 동일)
# vi pagealivecheck.js
============
var b_page_alive = true;
============

(4. 예상되는 문제점)
아무래도.. php의 REQUEST_URI 값을 넘기므로..
혹여 POST로 접근한다면 처리가 안될듯.
xe에서 post로 넘기는 경우가 있는진 모르겠지만..
일단 대표도메인으로 바로들어오는 상황은 게시물주소, 트랙백 등 외부에 노출된경우가 대부분일것이므로 post로 넘어오진 않을것 같다.
며칠 써보면 알게되겠지..

Loading