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

时间:2012-08-07 16:24:26

标签: perl apache2 cgi cgi-bin

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

我试过运行它,我得到了500,而同一个目录(/ usr / lib / cgi-bin)中的Python代码显示正常。沮丧,我检查并三重检查权限,它开始于#!/ usr / bin / perl。我还检查了AddHandler是否设置为.pl。一切都设置得很好,一时兴起,我决定使用vim在服务器中编写完全相同的代码,就像我在Python文件中所做的一样。

瞧,它有效。我比较了他们,以为我疯了,他们完全一样。那么,这笔交易是什么?为什么Eclipse中的Windows 7中的文件与使用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

这是我得到的持续错误。

3 个答案:

答案 0 :(得分:12)

我认为在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

请注意我已在其中标出的0d - \r。如果我尝试使用./test.pl运行它,我会得到:

zsh: ./test.pl: bad interpreter: /usr/bin/perl^M: no such file or directory

然而,如果我在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

您可以通过以下几种方式解决此问题:

  1. 您可以使编辑器保存“UNIX行结尾”或类似内容。
  2. 保存后,您可以在文件上运行dos2unix或类似内容
  3. 您可以使用sed:sed -e 's/\r//g'或类似内容。
  4. 您的apache日志应该能够确认这一点(如果他们没有在开发服务器上稍微提高日志记录)。

答案 1 :(得分:2)

当然可以。

  • 一个环境可能安装了另一个可能不安装的模块。
  • Perl可能安装在两个环境中的不同位置。
  • 环境可能有不同版本的Perl。
  • 环境可能有不同的操作系统。
  • 在其中一个环境中可能无法正确设置权限。

但是,为什么不检查错误日志中实际得到的错误,而不是像这样疯狂地猜测?

答案 2 :(得分:0)

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