【コピペで使える】PHP・MySQLで実装する短縮URLシステム


 
https://tadworks.booth.pm/items/3994532

※BOOTHはピクシブ株式会社が運営するクリエイターのマーケットプレイスです。

 

はじめに

今回は短縮URLを自前で実装できないかということで試しに実装をしてみました。

短縮URLを提供するサービスはいろいろあるのですが、サービスの信頼性や持続性にどうも不安があったりしますし、探してもどうもこれというものがないことも多いかと思います。

そんなことで自前で短縮URLのしくみを実現できたらよいのではないかということで今回トライをしました。
 

実装方法

処理の流れ

まずは短縮URLの動作を実現するための処理の流れです。(ドメインの取得については省きます)

  • ①http//ドメイン名/パラメータ名/でアクセス
  • ②.htaccessでパラメータ名を引数にしてredirect.phpに渡す
  • ③redirect.phpでパラメータ名をもとにリダイレクト先URLを抽出しリダイレクト

とてもシンプルですね。短縮URL用ドメインはできるだけ短いものを取得しましょう。

せっかく短縮URLのしくみを作ってもドメインが長いと意味がなくなってしまいます。(短いドメイン名は探すのがなかなか難しいです)
 

構成ファイル

必須の構成ファイルは以下のふたつだけ。

  • ・.htaccess
  • ・redirect.php

このままですとindexファイルがないのでドメインでアクセスした場合エラーページになってしまいますから、何かしらindexページを設けておくとよいでしょう。
 

DB

パラメータ名をもとにリダイレクト先のURLを取得できればよいので、データベース構造もとてもシンプルです。

  • ・id
  • ・name:短縮URLの名称
  • ・parameter:短縮URLに付加するパラメーター文字列
  • ・url:リダイレクト先のURL
  • ・flg:有効(1) or 無効(2)
  • ・created:登録日時

name、flg、createdの3カラムは自分だけで使用する場合は必要ないかと思います。

このしくみを他社に提供する場合は、できるだけ管理しやすいように情報を追加するとよいでしょう。

以下SQL文も記載しておきます。テーブル名は今回「rd」としましたのでこの名称で進めてゆきます。
 

CREATE TABLE IF NOT EXISTS `rd` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` text NOT NULL COMMENT '名称',
`parameter` text NOT NULL COMMENT 'パラメータ名',
`url` text NOT NULL COMMENT 'リダイレクト先URL',
`flg` int(11) NOT NULL DEFAULT '1' COMMENT 'フラグ',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登録日',
PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

 

.htaccess

RewriteEngine on
RewriteBase /

RewriteRule ^(.*)/$ redirect.php?p=$1 [QSA,L]
RewriteRule ^(.*)$ redirect.php?p=$1 [QSA,L]

http://ドメイン名/パラメータ名/

でアクセスした際に以下引数付きURLにリダイレクトしています。

http://ドメイン名/redirect.php?p=パラメータ名

これによってredirect.phpにURLの一部を引数として渡すことができます。
 

redirect.php

<?php
// パラメーターの取得
$parameter = $_GET['p'];

// DB接続情報
define("CHARSET", "UTF-8");
define("DB_HOST", "");
define("DB_USER", "");
define("DB_PASS", "");
define("DB_NAME", "");

// URL抽出
$db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
$db->query('SET NAMES utf8');
$sql = "SELECT url FROM rd WHERE parameter = :parameter AND flg = 1;";
$stt = $db->prepare($sql);
$stt->bindParam(':parameter', $parameter);
$stt->execute();
while($row=$stt->fetch()){ $url = $row['url']; }

// リダイレクト
if(isset($url)){
  header('Location: '.$url);
} else {
  header('Location: https://yahoo.co.jp/');
}
exit;?>

パラメータ名に該当するレコードを検索し、そのレコードのURLを取得後リダイレクトを行います。

パラメータ名が存在しない場合は(ありがちな)ヤフートップに飛ばしていますが、ここは自身のサイトトップに飛ばしてもよいでしょう。
 

まとめ

いかがでしたか?意外と簡単に実装できますよね。

ただ、広告などで短縮URLを使用する場合は想定されるトラフィックによって大きな負荷がかかる恐れがあること、また、レンタルサーバーによってはリダイレクトのみの使用は禁止されていることもあるので注意が必要です。