【问题标题】:Why does my Perl CGI program return a server error?为什么我的 Perl CGI 程序返回服务器错误?
【发布时间】:2012-08-04 17:13:07
【问题描述】:

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

我尝试运行它,结果是 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

这是我得到的持续错误。

【问题讨论】:

  • apache 日志显示什么?
  • 调试 CGI 的第一条规则是,如果得到 500,则查看服务器日志。第二条规则是,如果出现问题,您可以在同一台机器上从命令行运行它以查看它的输出。
  • 我愿意把钱押在#!行而不是 \n
  • 另外,Content-Type: 标头末尾应该有 \r\n\r\n。
  • @tripleee,apache 处理 LF 就好了;它将CR LF 发送给客户端。 [这是对先前评论的转贴,已删除无关部分]

标签: perl apache2 cgi cgi-bin


【解决方案1】:

当你在 Windows 中编写 Perl 脚本时,我认为你的 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 |...代码去她| 00000020 65 0d 0a |e..| 00000023

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

zsh: ./test.pl: 错误的解释器: /usr/bin/perl^M: 没有这样的文件或目录

如果我在 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 在这里。| 00000020

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

  1. 您可能可以让您的编辑器保存“UNIX 行结尾”或类似内容。
  2. 您可以在保存文件后对文件运行dos2unix 或类似命令
  3. 您可以使用 sed:sed -e 's/\r//g' 或类似名称。

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

【讨论】:

  • 就是这样。感谢您为我运行这些测试。非常感谢您的时间和回复。
  • 谢谢,解释得很好。我花了几个小时才到达这里并找到您的解决方案!!
【解决方案2】:

当然可以。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2011-02-14
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多