我正在改变现有解决方案中的一些Perl脚本。由于升级(Windows)服务器时发生了一些变化,我将它们从运行ISAPI切换到CGI。这意味着我现在必须手动发送Content-Type,否则它将失败。
所以我需要启用输出缓冲(print语句,所以STDOUT),发送Content-Type:text / html,但是在重定向的情况下我需要清除输出缓冲区并发送新的标题。
我该怎么做?
还是有另一种方式吗?请注意,该脚本已使用print
输出HTML,我无法更改。 (它写于90年代初期。)
select(STDOUT);
$| = 0;
print "Content-Type: text/html\n\n";
# somehow clear output
print "Location: login.pl\n\n";
答案 0 :(得分:6)
您无法将print
“撤消”为STDOUT。在向STDOUT发送任何内容之前,您需要决定是生成HTML输出还是重定向。
这样做的一种方法是select
内存缓冲区而不是STDOUT:
my $buffer = '';
open(my $out, '>', \$buffer) or die;
select($out);
print "Content-Type: text/html\n\n";
if (generate_redirect) {
print STDOUT "Location: login.pl\n\n";
} else {
print STDOUT $buffer;
}
只要您确定不会生成重定向,就可以重新select
STDOUT并输出缓冲区:
select STDOUT;
print $buffer;
print "<p>HTML now goes to client instead of \$buffer</p>\n";
答案 1 :(得分:1)
最安全的(IMO)方法之一是将您需要的所有逻辑决定是否要在脚本顶部重定向,之前输出其他内容
如果您根本不想更改原始脚本,请编写一个单独的脚本,该脚本只执行重定向/内容类型逻辑,然后在必要时调用原始脚本。
答案 2 :(得分:0)
一个尚未涵盖的答案就是将STDOUT默认句柄替换为BEGIN中的不同句柄,然后在END中处理它,如果没有标题则添加Content-Type: text/html\n\n
。丑陋,但理论上应该有效。