본문 바로가기

카테고리 없음

단축 링크 서비스를 만들어보자 - #1

요즘 1일 1포스팅과 1일 1커밋에 도전하고 있습니다.

그래서 어제 커밋 주제를 고민하던 중 떠오른 것이 goo.gl, bit.ly 같은 단축 링크 서비스를 한번 만들어보자는 생각이 들었습니다.

bit.ly와 같은 서비스를 이용하면 긴 URL을 짧은 링크로 단축 시킬 수 있습니다.

 

곧바로 호스팅케이알(hosting.kr)에서 도메인을 구입했습니다. 제가 고른 도메인은 solt.pw입니다. 이걸 고른 이유는 마침 .pw 도메인이 세일 중이었고, 짧으면서 기억하기 쉬운 단어 중에 선점되지 않은 걸 찾다보니 이게 가장 좋아보였습니다.

설상가상으로 'Short Optimized Link Technology (최적화 단축 링크)'라는 의미도 끼워맞추 정했습니다.

이 도메인은 이제 제 겁니다.

 

기존 이용중인 호스팅 서버에서 하위 디렉터리(ws/utility/short-link)를 만들어 제공하기로 했습니다.

이러면 호스팅 비용이 추가로 들지 않습니다. (∴ 총 지출 = 도메인 구입 비용 VAT 포함 990원)

다용도 서버가 되어버렸다.

 

도메인 A레코드를 호스팅 서버로 설정했고, '/'의 .htaccess에 다음과 같이 추가했습니다.

#단축링크 도메인 서브폴더로 연결
RewriteEngine On
RewriteCond %{HTTP_HOST} ^solt\.pw [NC]
RewriteRule (.*) /ws/utility/short-link/

이제 solt.pw로 접속하면 서브 디렉토리로 연결 됩니다. (solt.pw → 서버/ws/utility/short-link)

한 가지 도메인에 대한 설정을 다르게 해 주었을 뿐인데, 하나의 서버로 두가지 이상의 서비스가 각각 '/'에 위치한 것처럼 나타납니다.

 

그리고 하위 디렉터리에도 .htaccess를 다음과 같이 추가했습니다.

RewriteEngine On
RewriteRule (.*) index.php

이러면 하위 uri에 상관 없이 무조건 index.php로 도달합니다. (solt.pw/1a2a3a4a5a  solt.pw)

이 부분이 제가 만들 단축 링크 서비스의 핵심이라고 해도 과언이 아닙니다. 의도대로 작동 되는 걸 확인한 시점에서 반쯤 완성한 기분이 들었습니다.

 


이후 index.php를 다음과 같이 작성해 주었습니다.

<?php

	header('Content-Type: text/html; charset=utf-8');
	
	include("include/sql/config.php");
	
	$uri = $_SERVER["REQUEST_URI"]; //도메인 단을 제외한 uri 단을 구합니다.
	
	if ($uri != "/")
	{	//uri 단에 문자열이 존재하면
		$hash = substr($uri,1);  //슬래시를 제외한 해시코드 추출
		$conn = mysqli_connect($config["host"], $config["username"], $config["password"], $config["database"]);  //DB 연결
		$query = "SELECT * FROM ".$config["table"]." WHERE hash = '$hash';";  //해당 해시에 대한 데이터 받아오기
		$result = mysqli_query($conn, $query);
		if ($result)
		{	//쿼리가 성공적으로 전송 되었으면
			$row = mysqli_fetch_array($result);
			if ($row != null)
			{ //해시코드에 대한 데이터가 등록 되어 있으면
				$url = $row["url"]; //url 가져오기
				
				echo "
					<script>
						var url = '$url';
						if (url.indexOf('http://') != 0 && url.indexOf('https://') != 0)
						{
							url = 'http://' + url;
						}
						location.href = url;
					</script>
				";  //해당하는 url으로 리다이렉션
			}
			else 
			{ //데이터가 등록 되어 있지 않으면
				echo "
					URL을 찾을 수 없습니다.
				";
			}
		}
		else
		{ //전송에 실패했으면
			echo "
				쿼리 전송에 실패했습니다.
			";
		}
		mysqli_close($conn);
	}
	else
	{	//uri 단에 문자열이 존재하지 않으면
		//인덱스 페이지 표시
		include("include/index.html");
	}

?>

 

참고로 include/sql/config.php와 테이블 구조는 이런 식으로 되어 있습니다.

<?php
	$config = array(
		'host' => 'localhost',
		'database' => '데이터베이스',
		'username' => '유저',
		'password' => '패스워드',
		'table' => '테이블',
	);
?>

 

CREATE TABLE 테이블명 (
		idx int(16) AUTO_INCREMENT PRIMARY KEY,
		timestamp varchar(64),
		hash varchar(64),
		url varchar(512),
	);

 

업로드 후, 테스트를 위한 데이터 한 줄을 테이블에 직접 추가해주었습니다. 

phpMyAdmin

 

그러고나서 테스트 해봤더니 리다이렉션이 정상적으로 동작하는 걸 확인할 수 있었습니다.

solt.pw/1a2a3a4a5a → www.google.com

 

이제 include/index.html에서 단축 링크 생성 페이지를 만들어 줄 것입니다.

 

2편에서 이어 작성하겠습니다.