PHP) 단축 URL 서비스 구축하기
준비물
- 웹서버 (Apache, NginX 등)
- PHP
- MySql(MariaDB)
이 글에서는 Apache 웹서버로 만들것입니다.
간단하게 구조 설명 : 단축 URL
단축 url은 이미 있는 url과 그에 해당하는 key를 만들고, key로 접근 시 url으로 리다이렉트 하는 서비스입니다.
쉽게 http://example.com/mykey 접속 시, 서버에서는 mykey와 매칭 되는 url을 찾습니다. (DB에서 검색)
key | url |
mykey | https://hi098123.tistory.com/ |
따라서 https://hi098123.tistory.com/으로 연결되게 만들 수 있습니다.
아주 간단하게 만들 수 있는 서비스이며, 소스가 공개되어 있는 경우도 많습니다.
이 글에서는 MIT라이선스로 누구나 가져다 쓸 수 있는 오픈소스를 이용해 구축해보려 합니다.
1. 먼저 아래의 소스를 다운로드합니다.
https://github.com/urls/url-shortener
해당 소스의 functions/shorten.php 경로에 오류가 있습니다.
session_start();
require_once("../config.php");
require_once("../UrlShortener.php");
$errors = false;
$insertCustom = false;
...
을 다음과 같이 수정합니다.
session_start();
require_once('../config.php');
require_once('./UrlShortener.php');
$errors = false;
$insertCustom = false;
...
2. 아파치 + PHP + MYSQL이 모두 설치된 환경을 가정하고 설명합니다.
연습용이라면 XAMPP를 이용해 한번에 모두 설치하거나, 닷홈 무료 호스팅, 000webhost무료호스팅을 이용할 수도 있습니다.
루트 폴더의 .htaccess 파일을 수정합니다.
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ functions/redirect.php?secret=$1 [L]
만약 NginX라면 아래와 같이 작성할 수 있습니다.
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /functions/redirect.php?secret=$1 break;
}
}
.htaccess 코드 설명
루트 경로로 전송된 값을 ( 예 : http://example.com/abc )
/functions/redirect.php의 secret 파라미터로 전송(GET 형태) ( 예 : http://example.com/functions/redirect.php?secret=abc )
3. 루트 폴더에 아까 전 1번에서 받은 파일을 넣습니다.
이 파일만 루트 폴더에 올리면 됩니다.
database 폴더의 파일은 phpmyadmin을 설치했다면 pma를 사용해도 되고,
데이터베이스에 직접 SQL 쿼리를 입력해도 됩니다.
CREATE TABLE IF NOT EXISTS `link` (
`id` int(11) NOT NULL,
`url` varchar(1000) DEFAULT NULL,
`code` varchar(20) DEFAULT NULL,
`created` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `link`
ADD PRIMARY KEY (`id`);
ALTER TABLE `link`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
4. 방금 이동시킨 config.php를 수정합니다.
if ( !defined('SITE_NAME') ){ define('SITE_NAME', "Make It Short!");//site title : index.php에서만 사용}
// URL LOCATION (Don't forget "/" at the end !)if ( !defined('BASE_URL') ){ define('BASE_URL', "/");}
// DATABASE CONFIGURATIONif ( !defined('HOST_NAME') ){ define('HOST_NAME', "127.0.0.1:3306"); //DB 주소}
if ( !defined('DB_NAME') ){ define('DB_NAME', "DATABASE_NAME"); //DB 이름}
if ( !defined('USER_NAME') ){ define('USER_NAME', "USERNAME"); //DB 아이디}
if ( !defined('USER_PASSWORD') ){ define('USER_PASSWORD', "PASSWORD"); //DB 비밀번호}
이제 완료되어 웹서버에 연결된 도메인 또는 http://127.0.0.1/index.php에서 새로운 단축 주소를 등록할 수 있습니다.
000webhost무료호스팅 이용한 방법
똑같은 내용을 직접 서버를 구축하는 게 아닌 간단히 웹호스팅을 이용해 구축해볼 수도 있습니다.
보통 요금제가 있기 때문에 잘 선택해야 됩니다.
000webhost가 트래픽이 많으면 무료 계정에서 호스팅을 제거시켜버린다고 말이 많긴 한데.
간단히 기능 구현용으로 사용해보았습니다.
어느 호스팅을 사용하나 비슷하다고 생각됩니다..
주의할 점은 실제 서비스를 만들 때 무료 서비스를 사용하면 안 됩니다. 안정성에 큰 지장이 있을 수 있습니다.
비슷한 글 hi098123.tistory.com/188
Tools메뉴의 Database Manager메뉴 접속 후 New Database를 눌러 새로운 DB를 생성합니다.
DBname 등 정보를 입력해 생성한다.
잠시 시간을 기다리면 관리(Manage) 버튼이 뜨게 됩니다.
클릭하여 PMA(phpmyadmin)에 접속합니다.
PMA에서 SQL을 눌러서 코드 입력 후 실행 버튼 클릭
CREATE TABLE `link` (
`id` int(11) NOT NULL,
`url` varchar(1000) DEFAULT NULL,
`code` varchar(20) DEFAULT NULL,
`created` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB;
ALTER TABLE `link`
ADD PRIMARY KEY (`id`);
ALTER TABLE `link`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
다시 관리창으로 돌아와서 File Manager에 접속합니다.
public_html (또는 www, htdocs 등) 클릭 후 업로드하기 클릭
깃허브에서 받은 파일을 업로드하였습니다.
config.php 에 DB정보를 기입하면 완료
functions/shorten.php 부분 수정을 안 했었다면 1번 깃허브 다운로드 부분으로 돌아가 소스를 수정해야 작동합니다.
이제 단축 주소를 생성해보자
https://php-url-demo.000webhostapp.com/hi098123 으로 생성해보았습니다.
접속 시 https://hi098123.tistory.com/ 으로 이동하게 됩니다.
이렇게 만들어진 Demo 페이지
https://php-url-demo.000webhostapp.com/
URL이 짧아야 좋습니다.
포스팅을 위해 무료로 만든것이기 때문에 굳이 도메인을 연결하진 않았습니다.
스팸 url 리다이렉트 남용 방지를 위해 티스토리가 아닌 주소 생성은 불가능하게 막아두었습니다.
- 웹비젼 // 제목줄 $subject_line = 1; $line_sheight = 20 * $subject_line…
- 웹비젼 네이버 meta 검색
- 웹비젼 '회원 가입시 생년월일을 입력하지 않아서 서비스를 받으실수 없습니다.' 라고 문구가 뜹니다. 그렇게 바꾸실려…
- 웹비젼 한글 설정 jQuery.datetimepicker.setLocale('kr'); $(function() { …
- 웹비젼 수정 전: alert(data.error); 수정 후: $tx.text(data.error); $tx.fad…
- 웹비젼 $(function(){ //달력 $(".datepicker").datepicker({changeMonth:…
- 웹비젼 I was using MaridDb solved this issue with the following: su…