(2024.12.20 記)
次のような要望がありましたので、実装にチャレンジしてみた内容をまとめた忘備録になります。
①URL短縮化サービスを独自に作って欲しい
②現行のレンタルサーバ上にサービスを作って欲しい
③不要になった短縮URLを任意に削除できるようにして欲しい
要はこれ、私にURL短縮化のAPIを作れって言ってるんだろうなと。
私の記憶だと、Pixivの職業体験か何かで実習生が作ったのが最初と記憶しています。
当時はスゲー、そんな事できるのか!って思ったけど、「こうすればできるんじゃね?」というアイデアがあったので、それを公開してみた次第です。
公開された技術ではないので、あくまでも個人的な妄想です。
0.実行環境
■実行環境
・さくらVPN(メモリ:1GB、CPU:2コア、SSD:100GB)
・LinuxOS:Ubuntu20.04LTS
・Apache:2.4
・MySQL:5.7
・PHP:7.2
■考案ロジック
・長尺URLを任意のロジックで短縮化する
・短縮化したURLの名前でPHPファイルを作成する(短縮化URL.php)
・上記PHPファイルの中に、長尺URLへリダイレクトするメタタグを記載する
・拡張子「.php」が無くてもアクセスできるよう「.htaccess」を弄る
1.短縮URL用ディレクトリ作成
方法は問わないので、以下2つのディレクトリを作成します。
①create(短縮URL生成ロジック格納場所、名前は問わない。)
②link(短縮URLの格納場所、名前は問わない。)
2.短縮URL生成ロジック格納場所の中身
①短縮URL生成APIロジック
「create」ディレクトリ内に次のファイルを作成します。
shorten.php(短縮URL生成API本体。名前は問わない。)
ファイルの中身は次のコードが記載されています。
<?php
$param1 = $_POST['long_url'];
$token = $_POST['token'];
$res = "";
$shorturl = "https://ドメイン/link/"; //短縮URLの生成場所
$longurl = $param1;
$strcnt = 8; //短縮URLを何文字にするかの初期値
$flag = 0;
$count = 0;
//①長いURLをMD5でハッシュ化→先頭n文字($strcnt)を抽出
$shorten = mb_substr(md5($longurl), 0, $strcnt);
//②トークン判別(独自なので、社内だけでわかるパスワードでもOK)
if($token == "トークン値"){
}
else{
//トークンが無ければ追い返す
$flag = 1;
$res = "アクセス許可がありません。";
}
//③短縮URLが作成されるまでループ
while($flag == 0){
//ファイル存在チェック
if(file_exists("../link/".$shorten.".php")){
if($count >= 30){
//⑥30回ループしたら、さすがに競合しない短縮URL名が見つからないと判断し、抽出する文字を1桁増やす
$strcnt = $strcnt + 1;
$count = 0;
}
//⑤存在すれば、入力URLにタイムスタンプを付与した値をハッシュ化させる
$shorten = mb_substr(md5($longurl.strval(time())), 0, $strcnt);
//何回ループしたかカウントする
$count = $count + 1;
}
else{
//④存在しなければ、そのままリダイレクトページを作成する
$flag = 1;
$shorturl = $shorturl.$shorten;
$file = "../link/".$shorten.".php";
$writestr = '
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="ja" />
<meta name="robots" content="noindex">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>短縮URL</title>
<meta http-equiv="refresh" content="1; URL='.$longurl.'">
</html>
';
file_put_contents($file, $writestr, LOCK_EX);
if(!file_exists($file)){
$shorturl = "生成に失敗しました。";
}
//生成した短縮URLを返す
$res = $shorturl;
}
}
echo $res;
?>
★解説
①は長尺URLを短縮化させるロジックになります。
ここではMD5というハッシュ化させる関数を使って長尺URLをハッシュ値に変え、そのあと先頭8文字を抽出することで、短縮化をしています。
②トークン…というかっこいい言葉を使ってますが、アクセス許可していない人を弾くロジックになります。
社内で事前にパスコードのようなものを決めておき、その値が正しくないものに関しては不正アクセスとみなして何もしない、という動きをします。
③短縮URLのPHPファイルを生成するロジックになります。
①で短縮化した文字列のPHPファイルの存在チェックをし、なければそのまま生成します。
存在すれば、①で短縮化した文字列にタイムスタンプをつけて、再度ハッシュ化し頭8文字抜き出し、存在チェックにかけます。
これが30回繰り返されたら、流石に被りが多いと判断し、今度は頭8+N文字抜き出します。(Nは存在するファイルが見つかるまで1ずつ増える。)
④は③で作ったPHPファイルに、リダイレクトページに飛ばす内容を書き込むロジックになります。
リダイレクト先は、長尺URLになり、要は短縮URLにアクセスしたら対応する長尺URLにリダイレクトする、という手法で実現化しています。
②短縮URLアクセスロジック
「link」ディレクトリ内に次のファイルを作成します。
.htaccess(アクセス制御ファイル)
ファイルの中身は次のコードが記載されています。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php
「.htaccess」とはアクセス制御ファイルになっており、任意のIPを弾く等様々なアクセス時の細かな制御をコントロールできるようになります。
今回はそこに、「.php」という拡張子を省いても、「こっちで勝手に拡張子付けて該当ファイルを探してみるね~」みたいなことを書いてコントロールさせています。
これにより、短縮URLの文字列だけ打っても、該当するリダイレクトページにアクセスしてくれて、実際に対応する長尺URLページへリダイレクトしてくれるということが可能になります。
3.最後に
要約すると、
「任意のロジックで長尺URLを短縮」
「短縮した文字列のPHPファイルを作成し、長尺URLに飛ばすリダイレクトページを作成」
「拡張子を抜かしてもPHPファイルにアクセスする制御ファイルを作成」
この3つの動作を組み合わせて短縮URL生成APIとする、ということです。
実際のロジックはわかりませんが、結構いい線行ってるのではないだろうか・・・
参考になれば幸いです。
▼オススメ教本▼
コメント