最終更新日: 2014年1月13日
Squid Home / FAQトップ

15. Redirectors(リダイレクター)

15.1 Redirector(リダイレクター)とは何ですか?

Squidには、外部のプログラムを使ってリクエストされたURLを書き換える機能が実装されています。Squidはリダイレクターを通す事で入ってきたURLを空白、または別のURLに整形する事が可能です。
リダイレクタープログラムは、Squidに標準であるプログラムではありません。 しかし幾つものものがディストリビューションのパッケージ(例えば、contrib/ディレクトリなど)によって提供されているので、これらを使うと良いでしょう。

15.2 なぜリダイレクターが必要なのですか?

管理者が適正にリダイレクターを設定することで、Proxyを使ってのアクセスにおいて、ポルノサイトなどを見に行く事ができないようにする事ができます。

15.3 リダイレクターはどうやって機能していますか?

リダイレクタープログラムには、Squidから標準入力で1行のURLが渡されます。 これをリダイレクタは標準出力1行で、空白または整形したURLとして出力して下さい。 リダイレクタープログラムにおいては、バッファードI/Oによる入出力を使えないことに注意してください。  Squidでは、リダイレクターが処理する為に、URLの後ろに追加情報を足して渡します。 これは4つのフィールドで構成されます。

URL ip-address/fqdn ident method

15.4 何かリダイレクターの例がありますか?

SQUIRM と呼ばれるとてもシンプルで高速なリダイレクターが参考になります。 これは regex ライブラリを使ったパターンマッチングの機能を提供します。
また、以下のperlのスクリプトはあなたの作成するリダイレクターの参考になるかも知れません。

#!/usr/local/bin/perl
$|=1;
while (<>) {
s@http://fromhost.com@http://tohost.org@;
print;
}

15.5 リダイレクターはHTTPリダイレクトメセージを返せますか?

普通、リダイレクターは与えられたURLを書き直すのが目的ですが、しかし、幾つかの状況によっては、クライアントへHTTPの「301」または「302」のリダイレクターメッセージを返す方が適切かも知れません。 これはSquidのバージョン1.1.19から可能になっています。
リダイレクタープログラムの変更は単純で、「301:」または「302:」をURLを返す際に先頭に付けるだけです。以下のサンプルは、internalへのアクセスをセキュアなサーバに向かわせるためのリダイレクトの例です。

#!/usr/local/bin/perl
$|=1;
while (<>) {
@X = split;
$url = $X[0];
if ($url =~ /^http:\/\/internal\.foo\.com/) {
$url =~ s/^http/https/;
$url =~ s/internal/secure/;
print "302:$url\n";
} else {
print "$url\n";
}
}

301,302のHTTPの応答コードの意味については、RFC 2068 を参照してください。

15.6 FATAL: All redirectors have exited!が出ました

リダイレクタープログラムの標準入力がクローズされた場合に「FATAL: All redirectors have exited!」のメッセージが見る事になります。 これはおおよそ、リダイレクタープログラムのバグを意味します。 これは、だいたいにおいてメモリの範囲を超えたアクセスが有った場合や、メモリの領域を使いきった場合に出ることでしょう。
問題となったURLをsquidのaccess.logから取り出して、リダイレクタープログラムを直接起動して問題のURLを渡す事で問題を発見する事ができると思います。

15.7 リダイレクターのIDENTフィールドの内容が壊れています。

以下のようなリダイレクターを追加し結果を見ました。

#! /bin/sh
/usr/bin/tee /tmp/squid.log

すると、リダイレクターへのリクエストのIDENTフィールドにはユーザ名がはいっていません。 

これは、identの探索には時間がかかるため、Squidでは ident の為のACLを書かない限り、ident探索を行わないようになっている為です。
もし ident が必要ならば、Squidの設定ファイルの中で、
acl foo ident REQUIRED
http_access allow foo

という指定を行ってください。

Squid Home / FAQトップ

参考: