印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
DownloadLinuxPerl リファラの送出を防止するリダイレクト CGI

イントラサイトの URL 送出を防止するため,リダイレクト用の CGI を用意する。

■ ■ ■

nlog(n): イントラサイトの URL を内緒にしたい の続き。リダイレクタを書く。

サイトBに中継させる
サイトBに中継させる


サイト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) …… リファラは空になる。

リファラ実験 - referrer test

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 等の実行許可を与えておく。

#!/usr/bin/perl

use strict;
use CGI;

my $q = CGI->new;
my $url = $q->param('url');

print $q->header,
      $q->start_html(
          -declare_xml => 1,
          -title => 'Redirecting...',
          -head => $q->meta({
              -http_equiv => 'Refresh',
              -content => "5; URL=$url",
          }),
      ),
      'Jump to ' . $q->a({href => $url}, $url),
      $q->end_html;

ページを表示してから5秒後に,自動的に飛ぶようになっている。0 にすれば待ち時間なしになる。リンク先も表示されるので,自動的にジャンプしない場合は,リンクをクリックすればよい。使い方は次の通り。

redirect.cgi?url=リンク先のURL

このサイトに設置した場合,例えば飛び先を http://google.co.jp にするなら,次のように指定する。

http://nlogn.ath.cx/cgi-bin/redirect.cgi?url=http://google.co.jp

日本語を UTF-8 で書きたい場合は,次のようにすればよさそうだ (CGI::Session.pmでセッション管理)。

#!/usr/bin/perl

use strict;
use CGI;

my $q = CGI->new;
my $url = $q->param('url');
print $q->header(-charset => 'UTF-8'),
      $q->start_html(
          -declare_xml => 1,
          -lang => 'ja',
          -encoding => 'UTF-8',
          -title => 'Redirecting...',
          -head => $q->meta({
              -http_equiv => 'Refresh',
              -content => "5; URL=$url",
          }),
      ),
      '外部サイトにジャンプします: ' . $q->a({href => $url}, $url),
      $q->end_html;

外部の人に使わせたくない場合は,.htaccess 等で制限するのがいいだろう (How to hide .htaccess?)。正規表現を使うなら,Files ディレクティブよりも FilesMatch ディレクティブが推奨されている (Files ディレクティブ)。

<Files redirect.cgi>
  order allow,deny
  deny from all
  allow from YourDomain
</Files>

うちのサイトからしかアクセスを許さないのであれば,「YourDomain」には「nlogn.ath.cx」と書くことになる。

スクリプトは短いのに,説明が長くなってしまった。必要なことしか書いてないのだけれども。それはそうと,「redirect.cgi」で検索すると,沢山引っかかるのね…ギャフン! (redirect.cgi - Google 検索)。同じコードはないようだから,これはこれでよしとする。

ダウンロード:

Posted by n at 2008-02-14 22:04 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?