上文提到,squid大多数的rewrite_program是用perl编写的。现在就转几个简洁明了的redirect.pl。虽说我至今没把perl基础教程看完。不过从中领会一下squid的rewrite流程,还是可以的:

例一:这是最简单的url转向,把http://www.baidu.com/转到https://www.google.com:

#!/usr/bin/perl -w
$|=1;
while () {
    @X = split;
    $url = $X[0];
    if ($url =~ m#^http://www.baidu.com#) {
        print "302:http://www.google.com\n";
    } elsif ($url =~ m#^http://gmail.com#) {
        print "302:http://gmail.google.com\n";
    } else {
        print "$url\n";
    }
}

例二:这个的功效,是当第一次访问外网网站时,先跳转到公司主页一次,之后再访问就不再限制。

#!/usr/bin/perl -w
use strict;
use DB_File;
use vars qw (%cache $uri $cachetime);
$|=1;
my $timeout=3600;#缓存超时时间
while (){
    my ($client,$ident,$method)=();
    ($uri,$client,$ident,$method)=split;
    if (check($client)){
        next;
    }else{
        save($client);
        $uri="301:http://www.xxxx.cn";
    }
} continue {
    print $uri;
}

sub check {
    my $client=shift;
    # init cache time
    my $time=time();
    if (!$cachetime){
        $cachetime=$time+$timeout;
    }
    if ($time > $cachetime){
        %cache=();
        $cachetime=();
    }
    return 1 if $cache{$client};
    # reopen db
    my %ip=();
    tie %ip,"DB_File","/tmp/ip.db",O_CREAT|O_RDWR,0666;
    %cache=%ip; #hard copy?
    untie %ip;
    $cache{$client} ? 1:0;
}

sub save {
    my $client=shift;
    my %ip=();
    tie %ip,"DB_File","/tmp/ip.db",O_CREAT|O_RDWR,0666;
    $ip{$client}=1;
    untie %ip;
}