PHPで短縮URLを元に戻す

(1/1)
ブログやtwitter向けに短縮URLが重宝されている。当サイトでも、「PHPでly.bitを使ってURLを短縮する」で短縮APIの使い方を紹介した。
一方で、短縮したURLを元のURLに戻したいニーズもあるようだ。そこで今回は、ly.bit と tinyurl.com を対象に、短縮URLを元に戻すスクリプトを作ってみることにする。

(2021年5月3日)PHP8対応,リファラチェック追加

サンプル・プログラムの実行例

PHPで短縮URLを元に戻す

目次

サンプル・プログラム

圧縮ファイルの内容
expandURL.phpサンプル・プログラム本体。

解説:復元処理

 124: /**
 125:  * 短縮URLを復元する
 126:  * @param   string $short 短縮URL
 127:  * @return  string 元のURL/FALSE:未対応サービス,復元に失敗
 128: */
 129: function expandURL($short) {
 130:     global $Services;
 131: 
 132:     //対応サービスかどうか調べる
 133:     $arr = parse_url($short);
 134:     if (! in_array($arr['host'], $Services))    return FALSE;
 135: 
 136:     //短縮URLをソケット通信で呼び出す
 137:     $request  = "GET {$arr['path']} HTTP/1.1\r\n";
 138:     $request ."Host:  {$arr['host']}\r\n";
 139:     $request ."User-Agent: PHP/" . phpversion() . "\r\n\r\n";
 140:     $fp = fsockopen($arr['host'], 80);
 141:     if (! $fp)  return FALSE;
 142:     fputs($fp, $request);
 143: 
 144:     //レスポンス解析
 145:     while (! feof($fp)) {
 146:         $res = fgets($fp);
 147:         //復元URL検出
 148:         if (preg_match('/^Location: (.*)$/i', $res, $arr> 0) {
 149:             return $arr[1];
 150:         }
 151:     }
 152:     fclose($fp);
 153: 
 154:     return FALSE;
 155: }

プログラムの仕組みはさほど難しくない。
bit.lyTinyURL.com は、短縮URLを受け取ると Location ヘッダで元のURLへリダイレクトするようになっている。そこで、httpヘッダをトラップし、このLocationヘッダをつかまえてやればよい。

PHPでは、関数  fsockopen  を使うことで通信中のhttpヘッダをトラップすることができる。
Locationヘッダをつかまえるには、正規表現関数  preg_match  を利用した。

対応している短縮URLサービスのドメインは、グローバル変数 $Services に定義した。

こうしてできたユーザー関数 expandURL は、短縮URLを受け取り、復元したURLを返す。
ただし、グローバル変数 $Services に無いドメインならFALSEを返すようにしている。

参考サイト

(この項おわり)
header