2014-01-09 46 views
0

這是一個跟進這個問題Apache directory directive authentication based on Perl CGI::Session阿帕奇重寫規則來檢查登錄和重定向到

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

/文件是一個目錄列表。

我編輯了指令,以便如果用戶轉到webserver/files /他們被重定向到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); 
} 

我,很明顯,得到一個重定向循環錯誤阿帕奇

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