Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- php
- Ubuntu 20.04
- upbit
- 맛집
- ubuntu
- 옵티머스g
- 라라벨
- C
- 회고
- Laravel
- 옵G
- 제주도
- 코드이그나이터
- TiL
- 업비트
- FMS
- 라즈베리파이
- 셀레니움
- 프레임워크
- 옵지
- 라즈비안
- codeigniter
- 맥
- 우분투 20.04
- Raspberry Pi
- 옵티머스 g
- MySQL
- 20.04
- 우분투
- Selenium
Archives
- Today
- Total
평범한 이야기들
[PHP] 간단한 단축 URL 만들기 (shorten url) 본문
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 생성 프로세는 매우 쉽습니다.
- 줄이고자 하는 URL를 입력한다.
- 해당 URL이 있는지 확인한다.
- 존재하지 않기 때문에 단축 URL를 생성해준다.
- 해당 URL의 단축 URL 주소가 존재하면 해당 값을 가져온다.
- 단축 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 접속 시 프로세스도 매우 간단합니다.
- 단축 URL로 접속을 한다.
- 원 URL이 있는지 확인한다.
- 원 URL 이 없으면 오류 표시 후 referer 사이트로 리다이렉트
- 원 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