평범한 이야기들

[PHP] 간단한 단축 URL 만들기 (shorten url) 본문

평범한 개발 이야기/PHP

[PHP] 간단한 단축 URL 만들기 (shorten url)

songsariya 2021. 5. 10. 16:51
728x90

예전에 있었던 구글의 구글숏터(goo.gl 현재 서비스 중지) 또는 네이버에서 제공하는 미투두(me2.do) 와 같이 길이가 긴 인터넷 주소를 짧게 만들어주는 단축 URL 서비스를 직접 만들어 보았습니다. 이미 많이 사용하고 있는 비틀리(https://bitly.com/) 그 외 정말 다양하게 많은 사이트들에서 제공을 해주고 있습니다. 하지만 제가 가지고 있는 주소를 이용해 사용하기 위해서 작업을 해보았습니다.

 

1. 테이블 만들기

기본 기능인 URL 단축만을 위한 테이블입니다.

CREATE TABLE `shorten_url` (  
`seq` int unsigned NOT NULL AUTO_INCREMENT,  
`shorten_url` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
`base_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
`regdate` datetime DEFAULT NULL,  
PRIMARY KEY (`seq`),  
KEY `IDX_URL_CUT` (`shorten_url`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

 

2. 무작위 문자열 만들기

구글에서 검색을 하면 가장 많이 나오는 무작위 문자열 만들기 함수를 이용했습니다. 길이 지정을 할 수 있게 했습니다.

function makeUrlCut($length = 8)
{

    $characters  = "0123456789";
    $characters .= "abcdefghijklmnopqrstuvwxyz";
    $characters .= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $characters .= "_";

    $characters = str_shuffle($characters);

    $randomString = "";

    $loop = $length;
    while ($loop--) {
        $randomString .= $characters[mt_rand(0, strlen($characters) - 1)];
    }

    return $randomString;
}

 

3. 단축 URL 생성 프로세스

단축 URL 생성 프로세는 매우 쉽습니다.

  1. 줄이고자 하는 URL를 입력한다.
  2. 해당 URL이 있는지 확인한다.
    1.  존재하지 않기 때문에 단축 URL를 생성해준다.
    2.  해당 URL의 단축 URL 주소가 존재하면 해당 값을 가져온다.
  3. 단축 URL를 리턴한다.

소스코드

  • 따로 컨트롤러, 모델을 만들지 않고 제작했습니다.
  • 랜덤 문자열을 만들고 검증 과정을 거칩니다. (해당 랜덤 문자열이 존재할 수 있다.)
<?php

// base_url 값이 있는지 확인한다.
$sql = "SELECT seq
            , shorten_url
            , base_url
            , regdate 
        FROM shorten_url
        WHERE base_url = '{$base_url}' ";
$db->query($sql);
$result = $db->fetch();

if (!empty($result["shorten_url"])) {
    $shorten_url = $result["shorten_url"];
} else {

    // base_url 값이 없으면 새로 만들어준다.
    $maxLoop = 3;
    $makeSuccess = false;

    for ($i = 0; $i < $maxLoop; $i++) {

        $shorten_url = makeUrlCut();

        $sql = "SELECT seq
                     , shorten_url
                     , base_url
                     , regdate 
                  FROM shorten_url
                 WHERE shorten_url = '{$shorten_url}' ";
        $db->query($sql);
        $result =  $db->fetch();

        if (empty($result)) {
            $makeSuccess = true;
            break;
        }
    }

    if (!$makeSuccess) {
        $responseData["code"] = "100";
    } else {
        $sql = "INSERT 
                INTO shorten_url 
                    (shorten_url, base_url, regdate) 
            VALUES 
                    ('{$shorten_url}', '{$base_url}', NOW())";

        $db->query($sql);
    }
}

$responseData["code"] = "Success";
$responseData["shorten_url"] = $host."/".$shorten_url;

echo json_encode($responseData);

 

4. 단축 URL 접속

단축 URL 접속 시 프로세스도 매우 간단합니다.

  1. 단축 URL로 접속을 한다.
  2. 원 URL이 있는지 확인한다.
    1. 원 URL 이 없으면 오류 표시 후 referer 사이트로 리다이렉트
    2. 원 URL 이 있으면 해당 URL로 리다이렉트

소스코드

<?php
// shorten_url 값이 있는지 확인한다.
$sql = "SELECT seq
            , shorten_url
            , base_url
            , regdate 
        FROM shorten_url
        WHERE shorten_url = '{$parameter}' ";
$db->query($sql);
$result = $db->fetch();

if(!empty($result["base_url"])) {
    header("Location: https://{$result['base_url']}");
    exit;
} else {
    echo "<script>alert('잘못된 접근입니다.');history.go(-1);</script>";
    exit;
}

5. Pretty URL

단축 URL를 이용하려면 어떤 url이 들어와도 한 곳으로 보내어 관리할 수 있도록 해주는 것이 편합니다. 즉 Pretty URL을 적용해주는 것이 좋습니다. apache2에서 rewrite를 이용해 모든 url이 index.php로 접근하도록 수정을 했습니다.

// in /etc/apache2/sites-available/url.conf file.

<VirtualHost *:80>
 ... 중략 ...
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule "^/.*" "/home/user/public_html/shorten_url/index.php"
 ... 중략 ...
</VirtualHost>

 

이렇게 아주 간단하게 단축 URL를 제작해보았습니다.

궁금한 점은 댓글 달아주시면 감사하겠습니다.

728x90
Comments