Мне необходимо выборочно блокировать работу скриптов, параметры которым передаются при помощи метода GET. В логах Squid не отображаются передаваемые скрипту параметры, только имя скрипта, далее знак вопроса, указывается метод GET. Параметров не видно, в результате не получается заблокировать работу скрипта при передаче ему определенных параметров.
Подскажите, как это можно сделать?
В логах не отображается, попробуй посмотреть в сторону ACL и url-regex.
Если вдруг будет времяразбираться, то в сторону редиректоров.
>В логах не отображается, попробуй посмотреть в сторону ACL и url-regex.
>Если вдруг будет времяразбираться, то в сторону редиректоров.Я как раз сейчас с редиректорами пытаюсь разобраться, но не отрабатывает программа.
Как я понял, эта программа принимает от Squid несколько параметров, разделенных пробелами, первый из который - URL.
Работает цикл, который считывает все строчки из STDIN и может заменять URL, который потом возвращает через STDOUT. Для начала я пытаюсь выводить ту же строчку, которую прочитал в STDIN, потом немного пытался усложнить программу, заменив URL, но при этом создается ощущение, что программа зацикливается. Может есть какие-нибудь нюансы?
Может кто сможет привести простейший пример подобной программы?
Есть кучка типовых редиректоров, но у меня все осложняется тем, что все это приходится делать под Windows, а здесь многое работает через филейную часть.
Вот пример на perl'е. Я его использую немного для другой цели, чтобы трафик лимитировать, но в твоем случае впринципе легко модернизируется:
[root@gw /]# cat /etc/squid/r.pl
#!/usr/bin/perluse DBI;
use DBI::DBD;require "/etc/squid/logger.cfg";
$| = 1;
if ($LOG) {
open LOG, ">> $red_log";
unless ($LAZY_WRITE) { select LOG; $| = 1; select STDOUT; }
}while (<>) {
($url, $cl_ip, $ident, $method) = split;
$dbh = DBI->connect("DBI:mysql:$dbname:$dbhost:$dbport", $dbuser, $dbpass) or die "Cannot connect to DataBase";
$sth = $dbh->prepare('SELECT max_traff FROM t_dnload WHERE username=?;');
$sth->execute($ident);
$max_traff = $sth->fetchrow_array;
$sth->finish;$sth = $dbh->prepare('SELECT total_traff FROM t_dnload WHERE username=?;');
$sth->execute($ident);
$total_traff = $sth->fetchrow_array;
$sth->finish;if ($max_traff < $total_traff) { $url = $path_nl; }
print "$url $cl_ip $ident $method\n";
print LOG "$url $cl_ip $ident $method \n";$dbh->disconnect;
}
close LOG if $red_log;
___________________________________________[root@gw /]# cat /etc/squid/logger.cfg
#!/usr/bin/perl
# Base Script Variables
$my_host = "http://my.host.ru/";
$my_webpath = "sq_stat/red_page/no_limit.html";
$path_nl = $my_host.$my_webpath;# Logger path variables
$log_path = "/var/log/squid/";
$log_file = "access.log.0";
$input_file = $log_path.$log_file;# Redirector path variables
$red_log = $log_path."redirector.log";
$LAZY_WRITE = 1;# MySQL configuration
$dbname = 'squidlogs';
$dbhost = 'localhost';
$dbport = '3306';
$dbuser = 'sqstat';
$dbpass = 'sqstat';# SQL Commands for update table t_dnload.
$sel_username = "SELECT username FROM t_dnload;";
$get_traffics = "SELECT SUM(size) FROM logs WHERE username=?;";
$upd_tot_traf = "UPDATE t_dnload SET total_traff=? WHERE username=?;";
_____________________________mysql> describe t_dnload;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| username | varchar(20) | NO | | | |
| max_traff | bigint(20) | NO | | 0 | |
| total_traff | bigint(20) | NO | | 0 | |
+-------------+-------------+------+-----+---------+-------+
Спасибо за поддержку, разобрался я почему подвисал Squid, когда я пытался поставить редиректор, который сам написал. После обработки URL необходимо в STDOUT вывести какой-нибудь URL. Но в конце строки я забывал поставить обратный слеш n, чтобы оправить строчку в STDOUT. Сейчас все работает, скрипт докрутить дальше - дело техники :o)