HTTP-авторизация в cgi-скриптах
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)$
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
использование REMOTE_USER без HTTP-авторизации
Иногда требуется заменить HTTP-авторизацию на что-то другое, например определять пользователя по REMOTE_ADDR.
RewriteEngine On
RewriteMap addrtouser prg://tmp/rewrite.pl
RewriteCond %{REMOTE_ADDR} ^(.*)$
RewriteRule ^(.*) - [E=REMOTE_USER:${addrtouser:%1}]
/tmp/rewrite.pl:
#!/usr/bin/perl
$| = 1;
while (<STDIN>) {
if (/192.168.188.128/){
print "admin\n";
}else{
print "guest\n";
}
трассировка запросов
как-то нужно было сделать трассировку запросов происходящих в
EMC Documentum Webtop, само j2ee-приложение умеет записывать trace-log в определенный файл (в примере /u01/oracle/trace.log), но нужно было автоматически получить соответствие запрашиваемой страницы с ее трейсом, нашлось такое решение: скрипт из RewriteMap при обращении клиента начинает сохранять данные из trace-файла и одновременно ждет появления в журнале httpd уникального идентификатора запроса.
настройки mod_rewrite:
RewriteEngine On
RewriteMap dfctrace prg:/u01/oracle/product/ias/10.1.2/trace.pl
RewriteLock /u01/oracle/product/ias/10.1.2/rewrite.lock
RewriteCond %{REQUEST_URI} ^/webtop
RewriteCond %{HTTP_COOKIE} JSESSIONID=([^;]+)
RewriteRule ^(.*) - [E=COOKIE:${dfctrace:%1}]
настройки mod_log_config:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T %{COOKIE}e"
TransferLog "/u01/oracle/product/ias/10.1.2/Apache/Apache/logs/performance.log"
/u01/oracle/product/ias/10.1.2/trace.pl:
#!/usr/bin/perl
$| = 1; #STDOUT must be unbuffered
open F, '>>/u01/oracle/tracelog.txt';
use IO::Select;
open ALOG, "</u01/oracle/product/ias/10.1.2/Apache/Apache/logs/performance.log";
seek (ALOG,0,2); #seek to end of file
$alog = IO::Select->new();
$alog->add(\*ALOG);
$SIG{'INT'} = sub {close F; exit;};
$SIG{'TERM'} = sub {close F; exit;};
while (<STDIN>) {#catch begin of request
chomp;
my $randid=randid();
open TLOG, "</u01/oracle/trace.log";
seek (TLOG,0,2);
print "$randid\n";#start request
print F "starting request for cookie: $_, id: $randid\n";
findend($randid);
print F "ending request for id: $randid\n";
#code for tailing dfc trace
while (<TLOG>){
print F $_;
}
close TLOG;
}
sub randid {
my @CHARS = ('A'..'F','a'..'f',0..9);
my $length = 8;
return join '.', time, join '', (map $CHARS[rand $#CHARS], 0 .. $length), $unique_value++;
}
sub findend {
my $randid=shift;
while(@ready = $alog->can_read) {
foreach $fh (@ready){
while (<$fh>){
if (/ $randid$/){
print F $_;
return;
}
}
}
}
}