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サンプル・プログラム本体。

解説:復元処理

0124: /**
0125:  * 短縮URLを復元する
0126:  * @param string $short 短縮URL
0127:  * @return string 元のURL/FALSE:未対応サービス,復元に失敗
0128: */
0129: function expandURL($short) {
0130:     global $Services;
0131: 
0132:     //対応サービスかどうか調べる
0133:     $arr = parse_url($short);
0134:     if (! in_array($arr['host'], $Services)) return FALSE;
0135: 
0136:     //短縮URLをソケット通信で呼び出す
0137:     $request  = "GET {$arr['path']} HTTP/1.1\r\n";
0138:     $request .= "Host:  {$arr['host']}\r\n";
0139:     $request .= "User-Agent: PHP/" . phpversion() . "\r\n\r\n";
0140:     $fp = fsockopen($arr['host'], 80);
0141:     if (! $fp)   return FALSE;
0142:     fputs($fp$request);
0143: 
0144:     //レスポンス解析
0145:     while (! feof($fp)) {
0146:         $res = fgets($fp);
0147:         //復元URL検出
0148:         if (preg_match('/^Location: (.*)$/i', $res$arr) > 0) {
0149:             return $arr[1];
0150:         }
0151:     }
0152:     fclose($fp);
0153: 
0154:     return FALSE;
0155: }

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

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

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

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

参考サイト

(この項おわり)
header