500内部服务器错误Perl CGI

时间:2018-08-27 08:55:46

标签: perl

我的Perl CGI有问题。执行Perl脚本时,我看到一个错误:

在videoplayback.pl第4行中拆分使用未初始化的值$ params。

所以,我给我一个错误:

内部服务器错误

服务器遇到内部错误或配置错误,无法完成您的请求。

请通过[未提供地址]与服务器管理员联系,以告知他们该错误发生的时间以及在此错误发生之前您执行的操作。

有关此错误的更多信息,可在服务器错误日志中找到。

此外,尝试使用ErrorDocument处理请求时遇到404未找到错误。

请解决。

这是我的代码:

    #!/usr/bin/perl

$params= $ENV{'QUERY_STRING'};
@tokens=split('&', $params);

foreach $string (@tokens){ 

 @mess=split('=', $string);

 if(index($params, "audio")!=-1){
  if($mess[0] eq "range"){
   $range=$mess[1];
   $command="curl --header \"Range: bytes=${range}\" http://127.0.0.1/audio.mp4";

   print "HTTP/1.1 200 OK\r\n";
   print "Content-Length: ", length($command), "\r\n";
   print "Last-Modified: Fri, 28 Jun 2013 14:34:55 GMT\r\n";
   print "Content-Type: audio/mp4\r\n";
   print "Date: Wed, 17 Jul 2013 14:28:52 GMT\r\n";
   print "Expires: Wed, 17 Jul 2013 14:28:52 GMT\r\nCache-Control: private, max-age=22303\r\nAccept-Ranges: bytes\r\nAccess-Control-Allow-Origin: http://www.youtube.com\r\nAccess-Control-Allow-Credentials: true\r\nTiming-Allow-Origin: http://www.youtube.com\r\nConnection: keep-alive\r\nX-Content-Type-Options: nosniff\r\nServer: gvs 1.0\n\r\n";

   print `$command`;
  }
 }

 elsif(index($params, "video")!=-1){
  if($mess[0] eq "range"){
   print "Content-type: video/mp4\n\n";
   $range2=$mess[1];
   $command2="curl --header \"Range: bytes=${range2}\" http://127.0.0.1/planet_360.mp4";
   print `$command2`;
  }
 }
}

谢谢。

2 个答案:

答案 0 :(得分:0)

似乎您的环境变量“ QUERY_STRING”中没有任何内容。 如果不需要,可以这样做:

$params= $ENV{'QUERY_STRING'} ? $ENV{'QUERY_STRING'} : 'foo';

这将避免出现错误“使用未初始化的值$ params ..”。 您也可以通过以下方法进行测试

perl videoplayback.pl

在您的控制台中。

答案 1 :(得分:0)

您的CGI程序需要查询参数。查询参数是出现在?之后的URL的(可选)位。因此,在如下所示的URL中:

https://example.com/cgi/your_program.cgi?foo=1&bar=2

查询参数为foo=1&bar=2

在CGI程序中,您可以通过从$ENV{QUERY_STRING}中解析查询参数来访问查询参数。这就是程序的前几行。

但是如果这样调用您的程序会发生什么:

https://example.com/cgi/your_program.cgi

然后,没有查询参数,$ENV{QUERY_STRING}中将没有任何内容。这就是您看到的警告(它是警告,而不是错误)。在第4行上,您尝试拆分$params,但是$params中没有数据。您的程序需要在不传递任何参数的情况下进行处理。

但这不是杀死程序的原因。就像我说的,这是警告,不是错误。该错误是由另一个问题引起的。

CGI程序应该返回两件事-一组标头和一些内容。您显然知道,因为大部分代码都与打印标题和内容有关。但是,当没有参数时会发生什么呢?由于$params为空,因此@tokens也将不包含任何数据。这意味着您的foreach循环主体永远不会执行,也不会返回任何标头。

我敢打赌,您的Web服务器错误日志中包含“未找到标头”的内容。

还有几件事要考虑:

  • 始终将use strictuse warnings添加到您的Perl代码中。并解决它们揭示的问题(最明显的问题是需要使用my声明所有变量)。
  • 请考虑使用CGI.pm解析参数并创建标头。您没有考虑到这一点的复杂性。编写该模块的人已经考虑了它们。
  • CGI程序需要确切地发出一组标头。因此,将标头置于可以执行0次(如我们目前所执行的)或多次执行的循环中,这很奇怪。您将需要重新考虑这个逻辑。
  • 接受用户(例如range)的输入并将其直接传递给操作系统命令是灾难的根源。以这种方式使用它之前,请确保清除用户的输入。