【问题标题】:"End of script output before headers" - CGI on Apache“标头之前的脚本输出结束” - Apache 上的 CGI
【发布时间】:2025-12-08 21:05:01
【问题描述】:

我有以下 CGI 脚本:

#!c:\cygwin\bin\perl.exe

use CGI qw(:standard);

my $query = $CGI->new;

print header (
  -type   => "text/html",
  -status => "404 File not found"
);

print "<b>File not found</b>";

这给了我一个错误:

Server error!

The server encountered an internal error and was unable to complete your request.

Error message:
End of script output before headers: test.cgi

If you think this is a server error, please contact the webmaster.
Error 500
127.0.0.1
Apache/2.4.10 (Win32) OpenSSL/1.0.1h PHP/5.4.31

我查看了this(和其他类似的)问题,但标题不是printed,而不是我的。

我正在使用带有 Cygwin Perl 的 XAMPP Windows 包。

有人可以帮忙吗?谢谢。

【问题讨论】:

  • 内部服务器错误意味着你应该阅读服务器日志,在那里你可以看到 perl 在它死之前输出的错误消息。
  • 必须始终 use strictuse warnings 在您编写的每个 Perl 程序的顶部。这尤其适用于您向其他人寻求代码帮助的情况,因为这是一个非常简单的第一个调试步骤。在这种情况下,您会看到消息 Global symbol "$CGI" requires explicit package name,这正是您的问题的原因。

标签: apache perl cgi


【解决方案1】:

我不知道你为什么使用 $CGI 而不是 CGI

我觉得应该是

my $query = CGI->new;

在 Linux 上测试完美运行。

【讨论】:

    【解决方案2】:

    因此,正如其他人指出的那样,您的问题是使用了一个变量 ($CGI),而您实际上需要一个类名 (CGI)。但是,在我看来,这又引发了两个问题。

    1/ 你为什么首先尝试创建一个 CGI 对象?您正在使用基于函数的 CGI 接口(例如print header(...)),因此不需要 CGI 对象。

    2/ 你为什么要在 2014 年编写 CGI 程序? Perl Web 编程在这千年里已经取得了长足的进步,而您似乎还停留在 1990 年代:-/

    【讨论】: