« 今日の脳年齢2006年10月8日 | メイン | 今日の脳年齢2006年10月9日 »
2006年 10月 9日(月) 体育の日 先勝 今日は何の日?
Referrer消去リダイレクトCGI
Webシステムを構築していると、「あるURLへジャンプさせたい。」と言う要求がでてくる事が良くあります。この様な処理は 「リダイレクト」と呼ばれる処理により対応させることができます。
リダイレクトと言うのは、HTTPのLocationヘッダに特定のURLを指定して指定したURLへジャンプさせる手法で、 Webサーバーであれば種類やバージョンの違いに依らず利用する事ができる物です。
Perlで書くと、
#!/usr/bin/perl
use strict;
use CGI;my($cgi, $url);
$cgi = new CGI;
$url = $cgi->param('url');print "Location: ". $url. "\n\n";
exit(0);
こんなCGIを書くことで実現する事ができます。通常この方法で問題はありません。 PHPやASPで利用されるredirectもHTTPのLocationヘッダを利用して処理しています。Perlの場合 「Locationヘッダを出力する命令」が存在しないため、print文で書きます。(CGI.pmには、 $cgi->redirect($url);と言うメソッドが用意されていますが。)
しかし、この方法だと移動元ページの情報が移動先のページへ伝えられてしまいます。 商用ページではそれが問題になる事はほとんどありませんが、個人的な目的であったり、 アクセス解析の様なシステムの場合それでは都合が悪い場合もあります。
移動先を特定する事ができるのであれば、.htaccessのRedirectを利用する方法が優れていますが、 移動先が毎回変わる様な仕組みの場合.htaccessを利用するのは都合が良くありません。また、 ApacheやApacheと互換性があるHTTPd(Webサーバー)であれば良いのですが、 全てのHTTPdで利用できるとは限りません。
そこで、少し知恵を使います。Referrerに移動元ページの情報を伝えたく無い。
と言う事は移動先のページと移動元のページが直結されていなければ良いのです。
具体的には、
移動元のページ → リダイレクト用のページ → 移動先のページ
の様に、移動元のページと移動先のページの間に、別のページ(リダイレクト用のページ)を挟んでしまえば良いのです。
この方法であれば、移動先のページの1ページ前はリダイレクト用のページなので、
どう頑張っても移動元のページの情報を入手する事ができません。(余程、リダイレクト用のページが、
移動元のページの情報もリダイレクトしていれば話しは別ですが。。。)
リダイレクト用のページをどの様に作るか。ですが、ここが一番の問題です。一番簡単な方法はmetaを利用する方法です。
別の方法としては、JavaScriptを利用する方法もあります。しかし、metaは全てのブラウザで利用できる。と言う訳ではなく、
JavaScriptも無効にされていると意味はありません。
そこで、逆転の発想として移動先のページへ移動するためのアンカーも同時に表示してしまいます。そうすれば上記の問題はクリアできます。
では、この二つの方法のどちらが優れているか。ですが、結論から言ってしまうと、metaを利用する方法です。具体的には、
<meta http-equiv="refresh" content="0;url=http://www.yahoo.co.jp/">
の様に記述する事で指定のURLへ移動させます。上記のCGIをこの技法に変更するとこんな感じになります。
#!/usr/bin/perl
use strict;
use CGI;my($cgi, $url);
$cgi = new CGI;
$url = $cgi->param('url');print "Content-Type: text/html\n\n";
print <<"END_HTML";
<html>
<head>
<title>redirect.cgi?url=$url</title>
<meta http-equiv="refresh" content="0;url=$url">
<meta http-equiv="content-style-type" content="text/css">
<style type="text/css">
<!--
body {
font-size: 14px;
color: #000000;
background-color: #ffffff;
}
a {
color: #0000ff;
}
a:hover {
color: #ff0000;
}
-->
</style>
</head>
<body>
<div align="center">
リダイレクトしない時には、<a href="$url">ココをクリック</a>してください。
</div>
</body>
</html>
END_HTMLexit(0);
これを redirect.cgi と言う名前で保存します。(別の名前でも問題ありませんが。) 使い方ですが、例えば kibiwaka.com のルートへインストールし、Yahoo!へ移動させる時には、
http://www.kibiwaka.com/redirect.cgi?url=http://www.yahoo.co.jp/
と記述します。これで意図したページへ飛ぶ事ができます。当然、Referrerにも情報を残さないので、
どのページから移動したのかは分かりません。
もし、metaが動作しないブラウザで利用されたとしても、アンカーを表示する事で移動に支障を出す事はありません。
(明示的にクリックして頂く様ですが。)
リダイレクトすると、一瞬アンカーが表示されるなど、見た目には美しくはありませんが、 Referrer消去リダイレクトの方法としては、この方法が一番簡単で環境に左右されにくいでしょう。
Posted by kibiwaka : 2006年10月09日 20:30
トラックバック
- トラックバックを頂く記事の内容については、記事に関係する内容、記事への同調、記事への反論など、 記事の内容に関するもののみとします。
- トラックバック先の記事に、当サイト、または該当記事へのリンクが無い場合には、トラックバックを削除させていただく場合があります。
- Movable Typeの迷惑トラックバック感知機能により、トラックバックが受け付けられない場合があります。
- 法律に触れる可能性があると判断できるもの、当サイトへの掲載が不適当と思われる内容については、 事前の連絡をなしに削除する場合があります。
- 当サイト、黍若個人への連絡事項などがあれば、連絡用記事へトラックバックを付けてください。 個別の記事に付けないで下さい。
または、ウェブメールでご連絡下さい。 - 詳しくし、黍若日記 コメント・トラックバック・リンク基本方針をご覧下さい。
このエントリーのトラックバックURL:
このエントリーのリンク用URL:
このリストは、次のエントリーを参照しています: Referrer消去リダイレクトCGI:
You have many friends that post in your guestbook - it is cool! [続きを読む]
トラックバック時刻: 2007年04月11日 05:39
You have many friends that post in your guestbook - it is cool! [続きを読む]
トラックバック時刻: 2007年04月11日 05:40
トラックバック時刻: 2007年04月11日 08:57
トラックバック時刻: 2007年04月11日 10:26
トラックバック時刻: 2007年04月11日 12:24
トラックバック時刻: 2007年04月11日 12:38
コメント
- コメントを頂く記事の内容については、記事に関係する内容、記事への同調、記事への反論など、 記事の内容に関するもののみとします。
- Movable Typeの迷惑コメント感知機能により、コメントが受け付けられない場合があります。
- 法律に触れる可能性があると判断できるもの、当サイトへの掲載が不適当と思われる内容については、 事前の連絡をなしに削除する場合があります。
- 当サイト、黍若個人への連絡事項などがあれば、連絡用記事へコメントを付けてください。 個別の記事に付けないで下さい。
または、ウェブメールでご連絡下さい。 - 詳しくし、黍若日記 コメント・トラックバック・リンク基本方針をご覧下さい。

