-
주소 줄이기(URL Shortener) (2 完)서버개발캠프 4기/스마게 ▶개발◀이야기 2020. 1. 10. 10:51
사용 언어 : PHP, HTML
사용 라이브러리 : mysql, bitnami
[주소 축약]
1. 주소를 입력받을 페이지를 만든다.
2. 입력 받은 주소(Original URL, ourl)가 DB에 존재하는지 검색한다.
2.1. 존재하지 않는다면 축약 과정(Short URL, surl)을 거쳐 DB에 저장한다.
3. DB에서 ourl에 대응하는 surl을 출력한다.
[축약 주소 Redirect]
1. surl을 입력받는다.
2. DB에 있는지 확인한다.
2.1. 있다면 대응하는 ourl로 header 키워드를 이용해 redirect한다.
2.2. 없다면 축약하는 사이트로 redirect한다.[축약 주소 Redirect]
1. surl을 입력받는다.
축약된 주소를 주소창에 입력받는다.
근데 문제는 주소창에 있는 저 000040이라는 글자를 어떻게 가져오느냐는 것이다.
저걸 가져오기만 한다면 DB에서 검색해서 ourl를 return해주면 되는데!
원리는 파악하지는 못했지만 하는 법은 알았다.
Options -MultiViews RewriteEngine On Options -Indexes RewriteCond %{REQUEST_URI} !(.php$|.html$) RewriteRule ^(.*)$ index.php?htaccess=$1 [QSA,L]
.
왜 확장자가 htaccess일까?
뭔가의 약속일까? 아니면 html 내부적으로 뭔가 있는걸까?
아무튼 중요한건 이렇게 하면 작동된다는거다.
여기서 알아야 할 것은 line 4에 있는 RewriteCond와
line 5에 있는 RewriteRule이다.
일단 이 작동방식은
localhost/****같이 입력되면 ****를 어떤 특정 페이지에 전달한다.
그런데 모든 ****에 대해 이걸 수행하면 기존에 만들어뒀던
localhost/test.php나 localhost/db.php를 입력했을 때도 다른 페이지로 이동한다는 점이다.
그래서 어떤걸 무시할지를 정해두는 것이 RewriteCond고
어떤 페이지에 전달할지를 알려주는게 RewriteRule이다.
RewriteCond 같은 경우는 !(.php$|.html$)을 통해서 php 파일과 html 파일을 rewrite하지않고(무시하고)
RewriteRule 같은 경우는 index.php로 전달하라는 뜻이다.
그래서 제일 위의 사진처럼 주소창에 입력하게 된다면
000040이 index.php로 전달된다.
2. DB에 있는지 확인하고 redirect한다.
<?php function getOriginalURL($url) { $conn = mysqli_connect('localhost', '이름', '비번', 'urlshortening'); $sql = "SELECT ourl FROM topic WHERE surl='$url'"; $result = mysqli_query($conn, $sql); if($result == false) return null; $ourl = $result->fetch_object()->ourl; return $ourl; } ?> <!Doctype html> <html> <head> <meta charset="en"> <title></title> </head> <body> <?php $surl = $_GET["htaccess"]; $ourl = getOriginalURL($surl); if($ourl == null) header('Location: test.php'); else header('Location: https://'.$ourl); ?> </body> </html>
$_GET["htaccess"]를 이용하면 localhost/ 뒤에 있는 문자열을 가져올 수 있다.
이 문자열을 DB에서 검색해서 ourl을 가져온다.
getOriginalURL 함수를 통해서 DB를 검색하고 있다면 ourl을, 없다면 null을 return한다.
그후 ourl이 null이라면 DB에 없는 잘못된 주소이므로 축약하는 페이지로 이동시킨다.
ourl이 존재한다면 그 페이지로 이동시킨다.
이때 header 키워드를 사용했는데
'Location:' 이후에 https://를 붙이느냐 안붙이느냐에 따라서 결과가 달라진다.
https://를 붙이면 절대주소로서 정확히 원하는 페이지로 가고
안붙인다면 상대주소로서 localhost 페이지로 간다.
예를 들어서 $ourl = "www.naver.com"이라면
header('Location: '.$ourl)은 localhost/www.naver.com으로 이동하고
header('Location: https://'.$ourl)은 https://www.naver.com으로 이동한다.
'서버개발캠프 4기 > 스마게 ▶개발◀이야기' 카테고리의 다른 글
주소 줄이기(URL Shortener) (1) (0) 2020.01.10