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>