[web] 고정ip와 ddns를 이용하여 웹서비스 시 첫페이지에서 구분해서 띄워주기

pptp를 이용한 고정 ip서비스를 이용중이었는데..
어느정도 회선속도는 보장받고 싶고.. 그렇다고 비싼돈 들이기는 싫고..
ddns를 이용하자니 회선 속도만큼 쓸 수는 있는데.. 이게.. 좀 불안하고..(제때 제때 ip 변경이 적용되지 않거나 할 수 있으므로..)
기존에 쓰던 pptp서비스 기간도 다되가고(나름 가격대비 속도가 괜찮은편..) 연장을 할까하다가…
고정 ip는 느리더라도 제일싼걸로 해놓고..
ddns를 이용해서 서비스 하도록 했다.
다만 ddns가 제대로 업데이트를 안할경우를 대비해서.. 첫페이지에서 ddns페이지가 살아있나 확인하고, 살아있으면 ddns도메인으로 띄우고, 아니면 그냥 고정ip 도메인으로 띄우도록 하기로 했다.

0. 개요
1)index.html(index.php) 에서 ddns도메인의 테스트 페이지를 띄워서 살아있나 확인
2)살아있으면 ddns도메인의 intro페이지를 띄움
3)아니면 고정ip도메인의 intro페이지를 띄움
* 고정ip 도메인 : www.test.com
  ddns도메인 : test.ddns.com
  테스트페이지 : pagealivecheck.html (pagealivecheck.js)
  시작페이지 : intro.html

1. php 함수 이용
처음 생각은 php에서 소캣을 열거나 페이지를 불러와서 확인 하도록 했다.
기본적으로 GET으로 페이지 호출하는 소스를 참고해서 수정했다.
============
<?php
    $req_host = “www.test.com”;
    $mod_host = “test.ddns.com”;
    $start_page = “/intro.html”;
    $auth_param = “”;
    $target_ip=$mod_host;
    $target_port=80;
    $target_uri=”/pagealivecheck.html”;

    $pagealive = true;

    $http_header = array();
    $http_header[] = ‘GET ‘ . $target_uri . ‘ HTTP/1.1’;
    $http_header[] = ‘Host: ‘ . $target_ip . ‘:’ . $target_port;
    $http_header[] = ‘Authorization: Basic ‘.$auth_param;
    $http_header[] = ‘Accept: */*’;
    $http_header[] = ‘Connection: close’;
    $message = implode(“\r\n”,$http_header) . “\r\n\r\n”;

    $fp = fsockopen($target_ip,$target_port,$errno,$errstr,10);
    if(!get_resource_type($fp)==’stream’) { $pagealive=false; }
    if($pagealive && !fwrite($fp,$message)){
        fclose($fp);
        $pagealive = false;
    }

  if($pagealive)
  {
    $http_response=array();
    while(!feof($fp)){
        $http_response[]=fgets($fp,4096);
    }
    fclose($fp);

    $http_res_code=substr($http_response[0],9,3);
    $http_res_message=substr($http_response[0],13);

    if($http_res_code==”200″)
    {
        $pagealive = true;
    }
    else
    {
        $pagealive = false;
    }
  }

    if($pagealive)
    {
?>
<meta http-equiv=”refresh” content=”0; url=http://<?=$mod_host.$start_page?>” >
<?
    }
    else
    {
?>
<meta http-equiv=”refresh” content=”0; url=http://<?=$req_host.$start_page?>” >
<?
    }
?>
============
뭐 잘 돌아갔다.
잘돌아가는 줄 알았다.
그런데 문제가 하나 생겼다. 테스트 겸 해서.. ddns의 80포트를 막아봤다(공유기에서 포트포워딩 해주므로.. 그거 설정을 바꿔봤다.)
그런데.. ddns도메인으로 자꾸 연결하려고 하는거 아닌가..
생각해봤더니.. 서버단에서 채크를 하다보니.. 외부에서는 테스트페이지가 안열려도 공유기 내부에서는 테스트페이지가 열리나보다.

2. iframe, ajax 사용
해서.. javascript를 이용해서.. 브라우져단에서 페이지가 살았는지를 확인하고 싶어서..
iframe을 사용하다가.. ajax을 이용해서 해보려고 또 소스좀 참고 해서 했다.
결론은.. 잘 안된다.. 처음엔 문법을 잘몰라 헤매고.. 여차저차해서 만들었더니..
도메인이 달라서 계속 권한이 없다고 나오고 그런다.
권한에 대해 찾아보니.. iframe의 경우 뭐 프레임에 또 프레임을 넣어서 parent.parent 해서.. 하면 될것 같긴 하지만..
귀찮다.. -_-;;

3. js 파일 이용
생각해보니.. 그냥 js파일을 외부에서 불러들여왔던걸 생각했다.
그래서.. js 파일에 변수값 하나 세팅해주고.. 이파일을 불러온다음.
이 변수값이 세팅 됐는지.. 안됐는지.. 확인해서 다음페이지를 결정하기로 했다.
그랬더니.. 그런대로 잘 동작하는데..
한가지 문제점이.. onload 이벤트에 넣어줬더니.. js파일이 있는 경우에는 상관없는데..
js파일을 못 여는 경우.. 한참동안 시도를 하다가.. 그게 실패로 끝나야만 onload가 발생하더군..
meta테그로 refresh해봤는데.. 그것도 실패로 끝난뒤에 실행되는것 같고..
그래서.. 좀더 고민하다가.. 그냥 timeout으로 지정해버렸다.
해서.. 지금 사용하고 있는 소스는 다음과 같다.
javascript밖에 없어서.. html로 해도 되는데.. 그냥 php로 했다.

index.php
=============
<?php
    $req_host = “www.test.com”;         // 원 호스트(고정 ip, 저속)
    $mod_host = “test.ddns.com”;        // 수정 호스트(ddns, 고속)
    $start_page = “/intro.html”;        // 시작페이지

    $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.$start_page?>”;
        else
                document.location = “http://<?=$req_host.$start_page?>”;
}

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.$start_page?>”>
</head>
<body onload=’goStartPage()’>
</body>
</html>
=============

html을 원하면.. 아래파일로 하면 된다.
index.html
=============
<html>
<head>
<script language=’JavaScript’>
<!–
    var b_page_alive = false;   // mod_host, test_page 에서 true 로 셋해준다.

    var req_host = “www.test.com”;      // 원 호스트(고정 ip, 저속)
    var mod_host = “test.ddns.com”;     // 수정 호스트(ddns, 고속)
    var test_page = “/pagealivecheck.js”;       // 살아있는지 확인 b_page_alive = ture;
    var start_page = “/intro.html”;     // 시작페이지

function goStartPage()
{
        if(b_page_alive)
                document.location = “http://”+mod_host+start_page;
        else
                document.location = “http://”+req_host+start_page;
}

setTimeout(“goStartPage();”,3000);

//–>
</script>
<body onload=’goStartPage()’>
<script>
document.write(“<“+”script type=’text/javascript’ src=’http://”+mod_host+test_page+”‘>”+”<“+”/script”+”>”);
document.write(“<“+”meta http-equiv=’refresh’ content=’5; url=http://”+req_host+start_page+”‘>”);
</script>
</body>
</html>
=============

pagealivecheck.js 에는 그냥 다음과 같이 한줄만 있다.
=============
var b_page_alive = true;
=============

Loading