取消401后的Perl CGI重定向

时间:2017-04-01 23:22:48

标签: perl http http-headers 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;
  }
}

不幸的是,每当我尝试发送新标题时,它都会以纯文本形式收到。

提前感谢任何帮助。

1 个答案:

答案 0 :(得分: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忽略subs的原型。如果需要,请解决潜在问题。
  • checkUser的返回值是布尔值,因此它应该返回true或false值(例如01),而不是两个真值(例如{{1} }或N)。上面的代码假设您修复此问题。