t.co を経由しても履歴がちゃんと残るようにする

Twitter の強制短縮URL「t.co」経由のリンクを開くと、履歴がこんなふうに t.co だらけになってしまう。



ブラウザの問題といえばそれまでだが、不便なので直してみる。

1. ローカルに Web サーバを用意する

お手持ちの Web サーバで OK. サーバの設定で t.co 宛のリクエストが来たときに後述のプログラムが動くようにする。
ここでは Apache を使った。Mac Ports でインストールした Apache の場合、 /opt/local/apache2/conf/extra/httpd-vhosts.conf に次の記述をする。

<VirtualHost *:80>
    ServerName t.co
    DocumentRoot "/Users/chun/Sites/t.co"

    <Directory "/Users/chun/Sites/t.co">
        AllowOverride FileInfo Options
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

2. t.co を処理するプログラムを書く

ここが肝。PHP で書いたので PHP のコードを載せておく。
nslookup で t.co の IP アドレスを調べておくこと。今は 199.59.150.44 と 199.59.148.12 になっていた。

<?php
$params = preg_replace('{^/}', '', $_GET['url']);
$url = 'http://199.59.148.12/' . $params; // t.co の IP アドレス

$opts = array('http' => array(
        'header' => implode("\r\n", array(
                'Host: t.co', // 大事
                'User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www
.google.com/bot.html)', // なんとなく
        )),
));
$fh = @fopen($url, 'r', false, stream_context_create($opts));
@fclose($fh);

$location = '';
foreach ($http_response_header as $line) {
        if (strpos($line, ':') === false) continue;
        list ($key, $val) = explode(':', $line, 2);
        if (strtolower($key) === 'location') {
                $location = trim($val);
                break;
        }
}
if ($location) {
        $location = htmlspecialchars($location);
        echo <<<__EOT__
<title>t.co redirect: $location</title>
<script>
// window.onload ではダメらしい
setTimeout(function() {
        location.href = "$location";
}, 100);
</script>
<h1>t.co redirect: $location</h1>

__EOT__;
}
else {
        echo <<<__EOT__
<title>t.co redirect</title>
<h1>t.co redirect</h1>
<p>Not Found</p>

__EOT__;
}

この PHP スクリプトにパラメータを渡すため、.htaccess に次の記述をする。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

3. hosts で t.co をローカルのサーバに向ける

Mac なので /etc/hosts に書いた。

127.0.0.1       t.co

4. できあがり

図のように t.co のリンクが itmedia.co.jp に飛ばされ、履歴もちゃんと残っている。(∩´∀`)∩ワーイ