요즘 1일 1포스팅과 1일 1커밋에 도전하고 있습니다.
그래서 어제 커밋 주제를 고민하던 중 떠오른 것이 goo.gl, bit.ly 같은 단축 링크 서비스를 한번 만들어보자는 생각이 들었습니다.
곧바로 호스팅케이알(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),
);
업로드 후, 테스트를 위한 데이터 한 줄을 테이블에 직접 추가해주었습니다.
그러고나서 테스트 해봤더니 리다이렉션이 정상적으로 동작하는 걸 확인할 수 있었습니다.
이제 include/index.html에서 단축 링크 생성 페이지를 만들어 줄 것입니다.
2편에서 이어 작성하겠습니다.