2012-08-07 67 views
3

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

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

你看,它的工作。我比较他们,认为我疯了,他们是完全一样的。那么,交易是什么?为什么在Eclipse上的Windows 7中创建的文件与在Ubuntu服务器上使用vim创建的文件不同?他们有不同的二进制头文件吗?这可以真正影响我的开发环境。

#!/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 

这是持续的错误,我得到的。

+4

apache日志显示什么? – 2012-08-07 16:27:10

+7

调试CGI的第一条规则是,如果你得到一个500,你看看服务器日志。第二条规则是,如果出现问题,您可以从同一台机器上的命令行运行它,查看它输出的内容。 – Quentin 2012-08-07 16:28:10

+9

我会在#上投注\ r \ n!而不是\ n – Flexo 2012-08-07 16:28:48

回答

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 

而如果我写的Vim相同的代码在UNIX机器上,我得到:

 
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'或类似的。

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

+0

就是这样。感谢您为我运行这些测试。我非常感谢你的时间和回应。 – jeffberhow 2012-08-07 19:39:04

+0

谢谢,非常好的解释..花了我几小时到达这里,找到你的解决方案! – 2014-07-07 09:48:09

0

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

2

当然,它可以。

  • 一个环境可能安装了一个模块,而另一个环境可能没有安装其他模块。
  • Perl可能安装在两个环境中的不同位置。
  • 环境可能有不同版本的Perl。
  • 环境可能有不同的操作系统。
  • 权限可能会在其中一个环境中被错误地设置。

,而不是投机似地这样可是,你为什么不检查错误日志以什么样的错误你实际上得到了什么?

相关问题