HTTP-авторизация в cgi-скриптах

Apache не предоставляет переменную окружения HTTP_AUTHORIZATION для 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;
                }
            }
        }
    }
}
Comments