我想不出更好的关键词给谷歌这个问题,所以如果这是重复的话我会道歉。
这是我的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 :(得分: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->标头一次,并且应该在使用页面上可打印的任何内容之前