Squid против рекламы.

Сегодня интернет наполнен не всегда интересной рекламой. Баннерные сети уже порядком поднадоели тратить драгоценный трафик. Было решено убить рекламу на страницах. Конечно всю не убить, но трафик можно существенно сэкономить.

Там где находится наш офис конкуренция между интернет провайдерами отсутствует, точнее провайдер только один и цены у него не дешевые. Поэтому с увеличением штата сотрудников все более остро встает проблема экономии трафика.

Решение данной проблемы давно известна - это кэширующий прокси-сервер SQUID. Я покажу как его научить резать баннеры и счетчики. Добавим пару инструкций, к умолчательному конфигу - и все в порядке.

Нам помогут списки acl. Итак приступим к определению списков.

acl Banner url_regex "/etc/bannerlist"
acl NoBanner url_regex "/etc/bannerstoplist"

Если значение параметра заключено в кавычки - squid воспринимает это как путь к файлу. В файле должны располагаться регулярные выражения по одному на каждой строке. Если squid найдет совпадение с URL-ом текущего запроса, то запрос попадёт под влияние данного acl.

Для чего введен второй список - /etc/bannerstoplist ? Все просто - если какие-то УРЛы попадают под регулярное выражение, но это не реклама, и ULR не должне быть обрезан. Нужно составить другое выражение и записать его в /etc/bannerstoplist. Тогда мы сможем отменить блокирование данного УРЛа, но об этом чуть позже.

Итак списки заполнены - будем двигаться дальше. Пропишем для этих списков права доступа. У нас уже должно быть (при условии конечно, что squid настроен и работает) прописано приблизительно следующее:

http_access Allow localnet
http_access Deny mp3
http_access Deny avi
http_access Deny exe
http_access Deny !Safe_ports
http_access Deny all

Мы должны добавить права на наши списки в начало списка прав. Итак после добавления список будет выглядеть так:

http_access Allow NoBanner
http_access Deny Banner
http_access Allow localnet
http_access Deny mp3
http_access Deny avi
http_access Deny exe
http_access Deny !Safe_ports
http_access Deny all

Да, да… Сначала NoBanner, чтобы отменить действие Banner. Остается заполнить файлы регулярками, и переодически их пополнять. Я настроил блокирвку рекламы только вчера, и переодически пополняю список. Сейчас он у меня выглядит так:

top100-images.rambler.ru
.*bigmir.net.*
.*mystat-in.net.*
.*.spylog.com/cnt?.*
.*hotlog.ru/cgi-bin/.*
.*bs.yandex.ru.*
.*top.list.ru/counter.*

Через пару минут мне надоело заполнять его руками и я написал маленький скриптик:

<?php
define ('ban','/etc/bannerlist');
define ('noban','/etc/bannerstoplist');
if(isset($_POST['add'])){
	file_put_contents(ban,$_POST['banners']);
	file_put_contents(noban,$_POST['nobanners']);
system ("/etc/init.d/squid reload");
}
 
echo <<<DDD
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd"
     xml:lang="en" >
  <head>
    <title>Списки баннеров</title>
  </head>
  <body>
DDD;
 
$b = file_get_contents(ban);
$nb = file_get_contents(noban);
?>
<form action="" method="post">
<input type="submit" value="Сохранить списки"/>
<input type="hidden" name="add" value="yes"/>
<p>Список баннеров</p>
<textarea cols="60" rows="30" name="banners"><?php echo $b; ?></textarea>
<p>Список Исключений</p>
<textarea cols="60" rows="30" name="nobanners"><?php echo $nb; ?></textarea>
</form>
<?php
 
echo "
  </body>
</html>
";

Теперь Squid будет экономить наши деньги.

Если вы накопили достаточно большие списки рекламных урлов присылайте их мне: idler@instanceof.ru. Буду благодарен. Выложу их здесь.

Вот один из таких списков filter.txt

Последние изменения: %2010/%07/%24 %01:%Jul