【问题标题】:Perl throwing bad headers when there's a warning IIS当 IIS 出现警告时,Perl 会抛出错误的标头
【发布时间】:2013-05-23 20:54:53
【问题描述】:

好吧,这很奇怪。

我们所有的服务器都使用 ActivePerl 5.8.8 和 windows server 2003。

在一些开发过程中,我们遇到了一个问题,我们正在处理的脚本开始抛出 CGI 错误。没有多少打印标题会起作用,只是不断出现 CGI 错误。该问题已归咎于一台开发服务器。

经过一番挖掘,我发现问题与警告有关。当 perl 抛出某些警告时,页面从 IIS 中返回,带有错误的 CGI 标头并且正文中没有任何内容。特别是关于连接未初始化字符串的警告。

这是我正在使用的测试脚本。

use strict;


Main();

sub Main {
  my $Web = new CGI;
    my $SQL = VIN::SQL->new('INDIGO');
  print $Web->header();
  print "Testing!";
  print "/r/n/r/n/";
  my ($Body, $Title) = ('', '');
    my $Page;
    eval{
        $Page = "";
        $Page  = $Web->param('Page');
        print "Page " . $Page;

    };
}

添加无警告语句将意味着它运行。添加 Page 参数也意味着它运行。

知道可能是什么原因造成的吗?我想了解为什么在添加“无警告”声明并继续前进之前,就好像这发生在我们的生活环境中一样,我宁愿不添加无警告;系统中每个 perl 脚本的语句。

非常感谢您的帮助。

【问题讨论】:

    标签: perl iis activeperl


    【解决方案1】:

    $Page 不应该是undef,所以|| "" 确保分配的是空字符串。

    sub Main {
      my $Web = new CGI;
      my $SQL = VIN::SQL->new('INDIGO');
      print $Web->header();
      print "Testing!";
      print "/r/n/r/n/";
      my ($Body, $Title) = ('', '');
    
      my $Page = $Web->param('Page') || "";
      print "Page ". $Page;
    }
    

    【讨论】:

    • 好吧,我明白了。如果我这样做,代码可以正常工作。不幸的是,这个警告很常见,它已经像这样运行了大约 8 年。现在我们系统中的某些东西发生了变化,导致 perl 在发生这种情况时返回错误的标头。如果此问题在开发环境之外发生,我们有许多脚本需要更新。也没有 Debug 信息,系统日志中没有显示错误或进入 stderror 就我们所见,因此跟踪它发生的位置以修复每个单独的警告是一场噩梦。知道这是什么原因吗?
    • 我会在服务器上查看以前的 perl 版本。
    • 所有服务器都是 5.8.8 版本 222,并且没有改变。
    【解决方案2】:

    在调用print $Web->header(); 之前,某些东西正在向服务器发送错误消息。这意味着到服务器的输出类似于:

    Error on line 123: Cannot create foo
    Content-Type: text/html; charset=ISO-8859-1
    
    Testing
    

    这是一个错误的标题。

    将标题打印到代码的早期部分的简单修复。

    换行:

      my $SQL = VIN::SQL->new('INDIGO');
      print $Web->header();
    

      print $Web->header();
      my $SQL = VIN::SQL->new('INDIGO');
    

    可能会解决问题(错误的标头),而是将正在生成的错误消息打印到浏览器。

    【讨论】:

    • 这是我最初的想法,但除非我将标题打印包装在 BEGIN 块中,否则错误似乎会在发送前添加标题。感谢您的观看。
    • @CharGeorge 根据 STDOUT 和 STDERR 的配置方式(如果 STDERR 进入浏览器),STDOUT 上的缓冲可能会导致对 STDERR 的打印显示在更早的对 STDOUT 的打印之前。将标头移动到 BEGIN {} 块将解决此问题。有关这方面的一些想法,另请参阅 Redirecting CGI error output from STDERR to a file (python AND perl)
    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多