QRコードの為に自分のサイト(サービス)で短縮URL機能を実装してみました。
ただし、プログラム以外に、URLや、実行階層などのWEB環境によっては、大した短縮にならないケースもあるのと、静的HTML遷移系のWEBサイトなどは、あまり効果がでないことのほうが多いので、今回はクエリを大量にくっつけて遷移する系のWEBサイトの人がURLリンクによるパラメータ隠しと、超長いURIを一定の長さにまとめる事を目的にしています。
ちなみに、長いURLの参考として、Googleの検索結果ページのURLやAmazonの商品ページのURLなど、色々なパラメータがくっついて非常にクソ長くなっているのがわかります。
ソースコード
<?php
// 通常表示
if(isset($_GET["mode"])){
echo "<pre>";
echo "通常ページ表示".PHP_EOL;
echo "Query : ".$_GET["mode"].PHP_EOL;
$url = getShortUrl($_SERVER['QUERY_STRING']);
echo "このページの短縮URL : <a href='".$url."' target='_blank'>".$url."</a>".PHP_EOL;
echo "</pre>";
}
// 短縮URL判定処理
else{
$url = checkShortUrl($_SERVER['QUERY_STRING']);
if(!$url){
echo "Error paramater !!";
return;
}
header("Location: ".$url);
}
function checkShortUrl($query){
if(!$query){return;}
if(!strstr($query,"&")){return;}
$num = implode("",array_slice(explode("&",$query) , -1,1));
$key = implode("&",array_slice(explode("&",$query) , 0,-1));
$datas = getDatas();
$data = $datas[($num-1)];
if(!$data){return;}
$json = json_decode($data , true);
if($json["key"] == $key){
return $json["url"];
}
else{
return;
}
}
function getShortUrl(){
$uri = getUri();
$datas = getDatas();
for($i=0; $i<count($datas); $i++){
if(!$datas[$i]){continue;}
$json = json_decode($datas[$i] , true);
if(!isset($json["url"])){continue;}
if($json["url"] === $uri){
$json["num"] = $i+1;
return makeShortUrl($json);
}
}
return setShorturl();
}
function setShorturl(){
$dataFile = "data.json";
$uri = getUri();
$md5 = md5(time());
$md5 = substr($md5 , -5);
$data = array(
"key" => $md5,
"url" => $uri
);
file_put_contents($dataFile , json_encode($data , JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES).PHP_EOL , FILE_APPEND);
$datas = getDatas();
for($i=0; $i<count($datas); $i++){
if(!$datas[$i]){continue;}
$json = json_decode($datas[$i] , true);
if(!isset($json["url"])){continue;}
if($json["url"] === $uri){
$json["num"] = $i+1;
return makeShortUrl($json);
}
}
return "Error !!";
}
function getUri(){
$http = $_SERVER['REQUEST_SCHEME'];
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
$url = $http."://".$host.$uri;
return $url;
}
function getDatas(){
$dataFile = "data.json";
if(!is_file($dataFile)){return;}
$datas = explode("\n",file_get_contents($dataFile));
return $datas;
}
function makeShortUrl($json){
$http = $_SERVER['REQUEST_SCHEME'];
$host = $_SERVER['HTTP_HOST'];
$urls = explode("?",$_SERVER['REQUEST_URI']);
return $http."://".$host.$urls[0]."?".$json["key"]."&".$json["num"];
}
解説
このPHPをWEBサイトのroot階層で実行すると、同じ階層に"data.json"というデータファイルが自動的に作成されます。
index.phpの内容は、表示しているURLにくっつけられた、URLから短縮URLを作成して、それを表示するようにしています。
クエリ値を変更すると、新たな短縮URLが自動的に作成されます。
表示されているURLをクリックすると、一度短縮URLに遷移して、それから短縮された元のURLにリダイレクトされます。
※同じページに返ってっくるだけなのですが・・・
次ページを短縮する仕様を、入力フォームを元に短縮URLを発行する仕組みに変更すると、
bitlyのようなサービスを作ることも可能です。
また既存のシステムのQRコードを出力する際に、この機能を通して行うことで、出来る限りシンプルなQRコード表示を行うことが可能です。
このプログラムはunix-timeの秒データをmd5変換して、さらにそのデータの最初の5文字のみを抽出して使うようにしていますが、任意コード(key)で登録して利用することも可能です。
ただし、重複登録しないようにkeyのユニークチェックを行う必要があります。
その5桁の任意keyコードに、"&*"という数字をくっつけているのですが、これはデータベースの行数を指定して、keyコードとの判別に利用しています。
今回はテキストデータで行っていますが、データベースにtableを作って運用することも可能だし、簡易に高速に行いたいのであれば、jqコマンドで判定を行うという手もあります。
単純にURL遷移するだけであれば、短縮することにこだわらなくていいので、適材適所でお使いください。
より短縮URLを活用するために・・・
この機能を、サブドメインなどで利用しては全く意味がありません。
URLにおけるバイト数(情報量)を出来る限り短縮することで恩恵が得られる短縮URL機能なので、ドメイン(host名)も出来る限り短いほうがいいし、サブドメインなど使わずにネイキッドドメインで使うほうがより情報量を抑えられます。
また、サイトの階層に置いても、root階層でdefault-indexプログラムで動作するほうがより効果的でしょう。
さらに、Aタグで利用するのであれば、"http://"などのプロトコルヘッダも要らないので外してしまってもさらにデータ量の削減に貢献できます。
セキュリティにも利用できるこの機能、もっと使えばいいのに・・・と思える場面も少なくないので、世の中のエンジニアの方がめんどくさがらずにやればいいだけなんですけどね。
そうした作業は短縮しちゃ駄目ですね。
0 件のコメント:
コメントを投稿