Баннеры для некоторых вебмастеров это способ заработать денег, это не для кого не секрет, однако некоторые сайты (преимущественно развлекательного характера) забиты рекламой просто под завяку, несколько улучшить ситуацию можно с помощью squid'а, во первых он кэширует странички, а во вторых может контролировать доступ в том числе и к рекламе (и к социальным сетям).
Однако помимо squid'а есть ещё различные другие методы фильтрации входящего траффика, в том числе privoxy, dansguardian (к нему можно прикрутить clamAV и/или KAV) и расширение для Firefox под названием AdBlock Plus и, что самое замечательное, их можно использовать совместно.
Отдельно следует заметить, что к написанию шаблонов (регулярных выражений) надо подходить внимательно, чтобы ненароком не срубить лишнего.
Итак к делу, я опущу настройки сквида, связанные с кэшем, правилами доступа, авторизацией, ограничением скорости, взаимодействием с другими серверами по вертикали и по горизонали, настройками SSL, протоколированием и тд. Перехожу сразу к самой идее управления через переписывание url.
Основная идея заключается в том, чтобы получив некий url вернуть запросившему в ответ либо неизменный url либо редирект на нужную страничку. Для того, чтобы принять такое решение нам нужно разобрать входные данные, которые squd передаёт на STDIN редиректору:
http://i.rl0.ru/search/rsearch_bg_br.gif 192.168.10.140/- - GET - myip=192.168.10.1 myport=3128
вот типичная строка, я думаю дальнейшие пояснения излишни, тем более, что на данный момент меня беспокоит больше первое поле этой записи (я же баннеры резать собрался) исходя из этого я написал простенький редиректор, который я приведу позже.
Настройки squid'а сводятся к записи в конфиге:
url_rewrite_program "path/to/redirector"
url_rewrite_children 3
url_rewrite_concurrency 0
мой редиректор однопоточный. В многопоточном редиректоре может появиться смысл только при очень больших нагрузках... да и редиректор в таком случае имеет смысл писать либо на Си либо на Си++.
что в фильтре? там находятся регулярные выражения того, что должно редиректиться, вот пример самого общего фильтра:
/[B|b]ann?e?r?[s|z|ex|click\.php]?[0-9]?[a-z]?[/|\.]?
rekla[ma]?
/ads/
/promo/
/[b|B]anner/
/[js]?ad[j|s|v|x]?/adclick[\.|/]
/ad[image|view|click|frame|log|net|x|js]\.[php|js|exe|dll|ru]
/informers?/[0-9][0-9]?[0-9]?[0-9]?\.js
/informer/sites
[/|\.]popunder[\.|/][ru|js|php]?
дальше додумывайте сами (если хватит рук, то может я напишу парсилку фильтров от adblockplus)
ну и есть одна тонкость - нам понадобится веб-сервер, на котором мы разместим замены беннерам (прозрачный 1 пиксельный гиф, пустую html'ку, 1 пиксельный jpeg, 1 пиксельный png, пустой swf, пустой txt ), для таких целей вполне подходит nginx, он статику очень хорошо раздаёт, для более сложных редиректов может понадобиться сервер с поддержкой CGI (или связка nginx+apache допустим)
вот собственно сам редиректор:
#!/usr/bin/perl
# last modified: 17 Apr 2009
# author Eleksir
# distributed under terms of 3 clause BSDL
use strict;
use warnings "all";
use Fcntl;
######################### SETTINGS ######################
# where to redirect
my $redirUrlHtml = '302:http://server/empty.html';
my $redirUrlGif = '302:http://server/empty.gif';
my $redirUrlJpeg = '302:http://server/empty.jpeg';
my $redirUrlSWF = '302:http://server/empty.gif';
my $redirUrlTxt = '302:http://server/empty.txt';
# List of banned urls
my $banList = '/usr/local/etc/bad_sites.list';
###################### SETTINGS ENDS ###################
select( STDIN ), $| = 1;
select( STDERR ), $| = 1;
select( STDOUT ), $| = 1;
my @urls; $#urls = -1;
open(URLS, "$banList") || die "Cannot open file $banList";
@urls = <URLS>;
close(URLS);
my $c;
for($c = 0; $c <= $#urls; $c++){
# sanity checks missing!
my @tmparr = split('/', $urls[$c]);
$urls[$c] = join('\/', @tmparr);
undef @tmparr;
chomp($urls[$c]);
# if last line of filter list ends with slash but not with newline symbol
# slash will be chopped
}
$c = 0;
my $str;
while($str = <STDIN>){
my ($url, undef) = split(/\s+/, $str);
my $urll = '';
while($urll = $urls[$c]){
if($url =~ m/$urll/o){
if($url =~ m/\.gif/i){ $url = $redirUrlGif; }
elsif($url =~ m/\.jpe?g/i){ $url = $redirUrlJpeg; }
elsif($url =~ m/\.swf/i){ $url = $redirUrlSWF; }
elsif($url =~ m/\.css/i){ $url = $redirUrlTxt; }
elsif($url =~ m/\.js/i){ $url = $redirUrlTxt; }
else{ $url = $redirUrlHtml; }
last;
}
$c++;
}
syswrite STDOUT, "$url\n";
$str = '';
undef $urll;
undef $url;
$c = 0;
}
undef $str;
undef $c;
undef @urls;
close(STDIN);
close(STDOUT);
close(STDERR);
exit 0;
вот <a href="../snippets/redirector.pl.txt" target="_blank">редиректор</a> и <a href="../snippets/bad_sites.list.txt" target="_blank">затравочка</a> для фильтра