イントラサイトの URL 送出を防止するため,リダイレクト用の CGI を用意する。
nlog(n): イントラサイトの URL を内緒にしたい の続き。リダイレクタを書く。
サイトAからサイトCへ直接リンクせず,一旦サイトBに中継させる。中継させることで,サイトAのリファラをCに送らないようにするのが目的である。ここではリダイレクタ B を実装する。B はサイトAへのリンクが書かれているだけでもよいが,自動的に飛んでくれればなおよい。
リファラの動きについては リファラ実験 - referrer test が参考になった。飛べないブラウザがないという「METAタグのRefreshを使用する」を採用することにした。
METAタグのRefreshを使用する
- Firefox 1.0.4 …… リファラは空になる。
- Opera 8.0 …… リファラはrefresh.htmlになる。リロードするとこのページに変わる(キャッシュはオフ)。
- IE 6 …… リファラは空になる。
- NS 7 …… リファラは空になる。
- Opera 7 …… リファラは空になる。
- Lynx 2.8(cygwin) …… リファラはこのページになる。
- w3m 0.1.9(cygwin) …… リファラは空になる。
CGI.pm モジュールを使うと簡潔に書ける (CGI - 簡単なCGI(Common Gateway Interface)クラス)。エラーの場合のエラー表示のために CGI::Carp を使おうと思ったが,「mod_perl 2.0 以上では動作しない Note that fatalsToBrowser does not work with mod_perl version 2.0 and higher.
」とあるので,やめにした (CGI::Carp - CGI routines for writing to the HTTPD (or other) error log - search.cpan.org)。
CGI.pm には,redirect という「まさにコレだ」的なメソッドが用意されているが,使わない。redirect メソッドは Location: を出力するのだが (Perlで作るCGI講座 - CGI.pm を使ってみよう - futomi's CGI Cafe),Location: はリンク元のリファラをそのまま飛ばし先に送ってしまうためである (リファラ実験 - referrer test)。
次の内容を redirect.cgi というファイル名で保存し,例えば DocumentRoot/cgi-bin/ に置く。パーミッションは 755 等の実行許可を与えておく。
ページを表示してから5秒後に,自動的に飛ぶようになっている。0 にすれば待ち時間なしになる。リンク先も表示されるので,自動的にジャンプしない場合は,リンクをクリックすればよい。使い方は次の通り。
このサイトに設置した場合,例えば飛び先を http://google.co.jp にするなら,次のように指定する。
日本語を UTF-8 で書きたい場合は,次のようにすればよさそうだ (CGI::Session.pmでセッション管理)。
外部の人に使わせたくない場合は,.htaccess 等で制限するのがいいだろう (How to hide .htaccess?)。正規表現を使うなら,Files ディレクティブよりも FilesMatch ディレクティブが推奨されている (Files ディレクティブ)。
うちのサイトからしかアクセスを許さないのであれば,「YourDomain」には「nlogn.ath.cx」と書くことになる。
スクリプトは短いのに,説明が長くなってしまった。必要なことしか書いてないのだけれども。それはそうと,「redirect.cgi」で検索すると,沢山引っかかるのね…ギャフン! (redirect.cgi - Google 検索)。同じコードはないようだから,これはこれでよしとする。
ダウンロード:
Posted by n at 2008-02-14 22:04 | Edit | Comments (0) | Trackback(0)
Master Archive Index
Total Entry Count: 1957