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

サンプル・プログラム
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.ly や TinyURL.com は、短縮URL を受け取ると Location ヘッダで元の URL へリダイレクトするようになっている。そこで、http ヘッダをトラップし、この Location ヘッダをつかまえてやればよい。

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

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

こうしてできたユーザー関数 expandURL は、短縮URL を受け取り、復元した URL を返す。
ただし、グローバル変数 $Services に無いドメインなら FALSE を返すようにしている。
参考サイト
- bit.ly
- TinyURL.com
- PHP で bit.ly を使って URL を短縮する:ぱふぅ家のホームページ
一方で、短縮した URL を元の URL に戻したいニーズもあるようだ。そこで今回は、ly.bit と tinyurl.com を対象に、短縮URL を元に戻すスクリプトを作ってみることにする。
(2021 年 5 月 3 日)PHP8 対応,リファラチェック追加