Perl脚本字面上打印http标头而不是理解它们

时间:2014-02-18 09:15:59

标签: html perl

我想不出更好的关键词给谷歌这个问题,所以如果这是重复的话我会道歉。

这是我的logout.pl脚本基本上删除了cookie:

#!/usr/bin/perl -w
use strict;
use warnings;

use CGI;

my $q = new CGI;

print $q->header('text/html');

my $cookie = $q->cookie(
  -name    => 'CGISESSID',
  -value   => '',
  -expires => '-1d'
);

print $q->header(-cookie=>$cookie);
print $q->redirect('welcome.pl');

exit;

当我在浏览器中运行此脚本时,它会输出以下内容:

Set-Cookie: CGISESSID=; path=/; expires=Mon, 17-Feb-2014 09:05:42 GMT Date: Tue, 18 Feb 2014 09:05:42 GMT Content-Type: text/html; charset=ISO-8859-1 Status: 302 Found Location: welcome.pl

然而,我想要的是浏览器删除Cookie并重定向到welcome.pl

3 个答案:

答案 0 :(得分:8)

当您print $q->header时,会打印 all 标题,包括表示标题结尾的空白行,并在其内容后生成任何内容。您只需要print $q->header一次,不再需要。

答案 1 :(得分:2)

实际上还有一个问题可能是你自己没有想到的。您尝试发送到会话的“清除”Cookie必须与重定向一起发送。 -w切换通常不是您想要的,只是您拥有的use warnings。此外,重定向URL RFC:必须是绝对的。 “welcome.pl”最有可能工作,但这不是一个好习惯,而且我曾经在modperl应用程序中使用相对URI非常糟糕。所以,修改 -

#!/usr/bin/env perl
use strict;
use warnings;
use CGI;
use URI;

my $q = CGI->new;

my $cookie = $q->cookie(
  -name    => 'CGISESSID',
  -value   => '',
  -expires => '-1d'
);

my $welcome = URI->new_abs("welcome.pl", $q->url);

print $q->redirect( -uri => $welcome,
                    -cookie => $cookie,
                    -status => 302 );

exit;

答案 2 :(得分:1)

您应该在脚本中使用$ q->标头一次,并且应该在使用页面上可打印的任何内容之前