2014-01-09 2 views
0

Это является продолжением на этот вопрос Apache directory directive authentication based on Perl CGI::SessionApache RewriteRule проверить логин и перенаправить на страницу

Alias /files /myData/all 
<Directory /myData/all > 
    RewriteEngine On 
    RewriteBase/
    RewriteRule ^(.*)$ cgi-bin/checklogin.pl?url=/files/$1 [L,R] 
    Options +Indexes 
</Directory> 

/файлов является список каталогов.

Я отредактировал директиву, чтобы, если пользователь переходит к веб-серверу/файлам/они перенаправляются на checklogin.pl, который проверяет наличие сеанса. Если он есть, он должен перенаправить на URL-адрес, если он не переносит их на страницу входа.

Первая часть работает. Переадресация на $ url вызывает цикл.

my $url = $cgi->param("url"); 
my $cookie = $cgi->cookie('mysession'); 
if(!$cookie){ 
     $session = new CGI::Session(); 
     print $session->redirect('/loginpage.html'); 
}else{ 
    # HOW DO I display folder or files now? 
     $session = new CGI::Session(undef, $cookie, {Directory=>'/tmp/'}); 
     print $session->redirect($url); 
} 

Я, очевидно, получаю ошибку цикла редирект в Apache

This webpage has a redirect loop 
+0

Почему вы устанавливаете свой файл cookie для немедленного истечения срока действия? – ThisSuitIsBlackNot

+0

Это не имеет значения. Я удалил его, в этом случае нет существующего файла cookie. – Jabda

+0

. Вы не добавляете свой файл cookie в заголовки ответов, чтобы пользователь никогда не получил его. – ThisSuitIsBlackNot

ответ

1

Если перенаправить каждый запрос на checklogin.pl любые запросы из внутриchecklogin.pl будет перенаправлять checklogin.pl, который будет перенаправлять checklogin.pl, который будет перенаправлен на checklogin.pl ...

Вместо этого, почему бы вам не создать мастер-скрипт с функцией logged_in t по вашему запросу:

#!/usr/bin/perl -T 

use strict; 
use warnings; 

use CGI; 

sub logged_in { 
    # Check session 
} 

my $q = CGI->new; 

if (not logged_in()) { 
    print $q->redirect('http://url/to/login.html'); # Need to use a full URL 
} 
else { 
    # Do stuff 
} 
+0

/файлы не являются скриптами напрямую, но содержат файлы. Не скрипты мой сеанс отлично работает для остальной части сайта, мне нужен способ ограничить доступ к каталогам – Jabda

+1

Это * делает * ограничивает доступ к каталогам; пользователи не могут делать ничего, что вы не помещаете в блок 'else'. Я думаю, что вы действительно спрашиваете, как сделать пользовательский контроль доступа с Apache (так как вы хотите показать списки каталогов). Разумеется, вы можете распечатать содержимое определенного каталога в своем скрипте Perl. – ThisSuitIsBlackNot

+0

Как распечатать содержимое каталога в Perl, чтобы файлы можно было щелкнуть. – Jabda

Смежные вопросы