ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 주소 줄이기(URL Shortener) (2 完)
    서버개발캠프 4기/스마게 ▶개발◀이야기 2020. 1. 10. 10:51

    사용 언어 : PHP, HTML

    사용 라이브러리 : mysql, bitnami

     

    [주소 축약]
    1. 주소를 입력받을 페이지를 만든다.
    2. 입력 받은 주소(Original URL, ourl)가 DB에 존재하는지 검색한다.
        2.1. 존재하지 않는다면 축약 과정(Short URL, surl)을 거쳐 DB에 저장한다.
    3. DB에서 ourl에 대응하는 surl을 출력한다.


    [축약 주소 Redirect]
    1. surl을 입력받는다.
    2. DB에 있는지 확인한다.
        2.1. 있다면 대응하는 ourl로 header 키워드를 이용해 redirect한다.
        2.2. 없다면 축약하는 사이트로 redirect한다.

     

    [축약 주소 Redirect]

    1. surl을 입력받는다.

    축약된 주소를 주소창에 입력한다.

    축약된 주소를 주소창에 입력받는다.

    근데 문제는 주소창에 있는 저 000040이라는 글자를 어떻게 가져오느냐는 것이다.

    저걸 가져오기만 한다면 DB에서 검색해서 ourl를 return해주면 되는데!

     

    원리는 파악하지는 못했지만 하는 법은 알았다.

    Options -MultiViews	
    RewriteEngine On	
    Options -Indexes	
    RewriteCond %{REQUEST_URI} !(.php$|.html$)
    RewriteRule ^(.*)$ index.php?htaccess=$1 [QSA,L]

    .

    .htaccess라는 파일을 만든다. 파일 이름은 없고 확장자가 htaccess인 셈이다.

    왜 확장자가 htaccess일까?

    뭔가의 약속일까? 아니면 html 내부적으로 뭔가 있는걸까?

    아무튼 중요한건 이렇게 하면 작동된다는거다.

    여기서 알아야 할 것은 line 4에 있는 RewriteCond와

    line 5에 있는 RewriteRule이다.

     

    일단 이 작동방식은

    localhost/****같이 입력되면 ****를 어떤 특정 페이지에 전달한다.

    그런데 모든 ****에 대해 이걸 수행하면 기존에 만들어뒀던

    localhost/test.php나 localhost/db.php를 입력했을 때도 다른 페이지로 이동한다는 점이다.

    그래서 어떤걸 무시할지를 정해두는 것이 RewriteCond고

    어떤 페이지에 전달할지를 알려주는게 RewriteRule이다.

     

    RewriteCond 같은 경우는 !(.php$|.html$)을 통해서 php 파일과 html 파일을 rewrite하지않고(무시하고)

    RewriteRule 같은 경우는 index.php로 전달하라는 뜻이다.

     

    그래서 제일 위의 사진처럼 주소창에 입력하게 된다면

    000040이 index.php로 전달된다.

     

    2. DB에 있는지 확인하고 redirect한다.

    <?php
    function getOriginalURL($url)
    {
        $conn = mysqli_connect('localhost', '이름', '비번', 'urlshortening');
        $sql = "SELECT ourl FROM topic WHERE surl='$url'";
        $result = mysqli_query($conn, $sql);
    
        if($result == false) return null;
    
        $ourl = $result->fetch_object()->ourl;
        return $ourl;
    }
    ?>
    
    <!Doctype html>
    <html>
    <head>
        <meta charset="en">
        <title></title>
    </head>
    <body>
        <?php
        $surl = $_GET["htaccess"];
        $ourl = getOriginalURL($surl);
        if($ourl == null) header('Location: test.php');
        else header('Location: https://'.$ourl);
        ?>
    </body>
    </html>

    $_GET["htaccess"]를 이용하면 localhost/ 뒤에 있는 문자열을 가져올 수 있다.

    이 문자열을 DB에서 검색해서 ourl을 가져온다.

     

    getOriginalURL 함수를 통해서 DB를 검색하고 있다면 ourl을, 없다면 null을 return한다.

     

    그후 ourl이 null이라면 DB에 없는 잘못된 주소이므로 축약하는 페이지로 이동시킨다.

    ourl이 존재한다면 그 페이지로 이동시킨다.

     

    이때 header 키워드를 사용했는데

    'Location:' 이후에 https://를 붙이느냐 안붙이느냐에 따라서 결과가 달라진다.

    https://를 붙이면 절대주소로서 정확히 원하는 페이지로 가고

    안붙인다면 상대주소로서 localhost 페이지로 간다.

     

    예를 들어서 $ourl = "www.naver.com"이라면

    header('Location: '.$ourl)은 localhost/www.naver.com으로 이동하고

    header('Location: https://'.$ourl)은 https://www.naver.com으로 이동한다.

Designed by Tistory.