2017-04-01 57 views
0

我目前有一個小腳本運行,發送一個401到客戶端,取消和不提供用戶詳細信息時,腳本將不會返回任何內容。取消後的Perl CGI重定向401

我想發送重定向到它們來自的頁面。

主子程序看起來像這樣;

#!usr/bin/perl 
use strict; 
use CGI; 

sub checkAuth { 
    my ($user, $pass) = &getAuthUsers(); # Get the user and pass of already authenticated users. 
    unless ($user) { 
    &sendAuthenticationHeader(); # Send 401 
    } 

    # Check user against DB and return 1 for success. 
    if (&checkUser($user, $pass) eq 'Y') { return 1 }; 
    else { # This is the redirect I'm trying to issue. 
    my $cgi = CGI->new(); 
    print $cgi->redirect($ENV{HTTP_REFERER}); # Redirect to the referer url 
    exit; 
    } 
} 

不幸的是,每當我嘗試發送新的頭文件時,它都只是以純文本形式接收。

任何幫助表示讚賞,在此先感謝。

+0

您只能發送一個頭!您不能返回401和302(重定向)。你可以使用「http-equiv」或JS來讓瀏覽器重定向,但爲什麼只返回302? – ikegami

回答

1

sendAuthenticationHeader()發出帶有401狀態碼的標頭。

print $cgi->redirect($ENV{HTTP_REFERER});發出帶有302狀態碼的標題。當然,因爲你已經發出了一個頭文件,所以這被視爲正文。

如果你想重定向,沒有必要返回401。更改您的代碼

sub checkAuth { 
    my ($user, $pass) = getAuthUsers(); 

    if (!$user || !checkUser($user, $pass)) { 
    print CGI::redirect($ENV{HTTP_REFERER}); 
    exit; 
    } 
} 

注:

  • 刪除不正確&。不要讓Perl忽略潛艇的原型。如有需要,請解決相關問題。
  • checkUser返回值是布爾值,因此它應該返回一個真或假值(例如01),而不是兩個真值(例如NY)。上面的代碼假定你解決了這個問題。
+0

啊我getcha,剛剛實施它。 謝謝一堆ikegami。 – Fashim