2014-02-18 14 views
2

我想不出更好的关键字来Google这个问题,所以我很抱歉如果这是重复的。Perl脚本从字面上打印http标题而不是理解它们

这里是我的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

+0

@Prix这会打印:'状态:302找到的位置:welcome.pl' –

回答

8

当你print $q->header,打印所有标题,其中包括空白行,它表示标题的结尾,做任何东西后内容。你只需要一次,只需要print $q->header

1

你应该在你的脚本中使用$ Q->头只有一次,应该是实际上还有一个问题,你可能不知道你自己使用任何可打印

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; 
+1

这清除了很多我的潜意识“最佳实践”的疑惑。谢谢! –

相关问题