我的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`;
}
}
}
谢谢。
答案 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 strict
和use warnings
添加到您的Perl代码中。并解决它们揭示的问题(最明显的问题是需要使用my
声明所有变量)。range
)的输入并将其直接传递给操作系统命令是灾难的根源。以这种方式使用它之前,请确保清除用户的输入。