为什么Perl CGI程序返回服务器错误?

为什么Perl CGI程序返回服务器错误?,perl,apache2,cgi,cgi-bin,Perl,Apache2,Cgi,Cgi Bin,我最近开始学习cgi,并在vbox中设置了一个Ubuntu服务器。我编写的第一个程序是用Python通过ssh使用vim编写的。然后我在Windows7工作站上安装了Eclipse,并创建了完全相同的Perl文件;只是一个简单的hello world交易 我试着运行它,结果得到了500分,而同一目录(/usr/lib/cgi-bin)中的Python代码显示得很好。沮丧的是,我检查了三次权限,并从#开始检查/usr/bin/perl。我还检查了AddHandler是否设置为.pl。一切都设置得很

我最近开始学习cgi,并在vbox中设置了一个Ubuntu服务器。我编写的第一个程序是用Python通过ssh使用vim编写的。然后我在Windows7工作站上安装了Eclipse,并创建了完全相同的Perl文件;只是一个简单的hello world交易

我试着运行它,结果得到了500分,而同一目录(/usr/lib/cgi-bin)中的Python代码显示得很好。沮丧的是,我检查了三次权限,并从#开始检查/usr/bin/perl。我还检查了AddHandler是否设置为.pl。一切都设置得很好,我一时兴起,决定使用vim在服务器中编写与Python文件相同的代码

瞧,它成功了。我比较了他们,认为我疯了,他们完全一样。那么,怎么回事?为什么Eclipse上Windows7中生成的文件与使用vim的Ubuntu服务器中生成的文件不同?它们有不同的二进制头还是什么?这确实会影响我的开发环境

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Testing.";
Apache错误日志:

[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] (2)No such file or directory:     exec of '/usr/lib/cgi-bin/test.pl' failed
[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] Premature end of script headers: test.pl
[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] File does not exist: /var/www/favicon.ico

这是我得到的持续错误。

不,它们只是文本文件。当然,可以编写不可移植的程序,只需使用
system()
或其他依赖于环境的类似服务即可

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Testing.";
  • 一个环境可能安装了另一个环境可能没有安装的模块
  • Perl可能安装在两个环境中的不同位置
  • 这些环境可能有不同版本的Perl
  • 这些环境可能有不同的操作系统
  • 其中一个环境中的权限设置可能不正确

但是,与其像这样疯狂地猜测,不如检查一下错误日志,看看到底是什么错误?

我认为在Windows中编写Perl脚本时,它的第一行有一些虚假的
\r
字符

例如,我在Windows上创建了以下文件:

#!/usr/bin/perl

code goes here
使用hexdump查看时,会显示:

00000000 23 21 2f 75 73 72 2f 62 69 6e 2f 70 65 72 6c 0d |#!/usr/bin/perl.| 00000010 0a 0d 0a 63 6f 64 65 20 67 6f 65 73 20 68 65 72 |...code goes her| 00000020 65 0d 0a |e..| 00000023 然而,如果我在UNIX机器上用Vim编写相同的代码,我会得到:

00000000 23 21 2f 75 73 72 2f 62 69 6e 2f 70 65 72 6c 0a |#!/usr/bin/perl.| 00000010 0a 63 6f 64 65 20 67 6f 65 73 20 68 65 72 65 0a |.code goes here.| 00000020 00000000 23 21 2f 75 73 72 2f 62 69 6e 2f 70 65 72 6c 0a |/usr/bin/perl| 00000010 0a 63 6f 64 65 20 67 6f 65 73 20 68 65 72 65 0a。代码在这里| 00000020 您可以通过以下几种方式之一解决此问题:

  • 您可能可以让编辑器保存“UNIX行结尾”或类似内容
  • 保存文件后,可以在该文件上运行
    dos2unix
    或类似操作
  • 您可以使用sed:
    sed-e的/\r//g'
    或类似工具

  • 您的apache日志应该能够确认这一点(如果他们没有在您的开发服务器上启动一点日志记录)。

    apache日志显示了什么?调试CGI的第一条规则是,如果您得到500,您可以查看服务器日志。第二条规则是,如果出现问题,您可以从同一台机器上的命令行运行它,查看它的输出。我敢打赌这是#上的一个\r\n!行而不是\n行,内容类型:header的结尾应该有\r\n\r\n。@tripleee,apache handles
    LF
    很好;它向客户端发送
    CR LF
    。[这是先前评论的转载,删除了不相关的部分]就是这样。谢谢你帮我做这些测试。非常感谢您的时间和回复。谢谢,解释得很好。。我花了几个小时才到达这里,找到你的解决办法!!