使用perl cgi时出现错误500-但不是任何常见陷阱
我有一个非常棘手的perl问题,它严重阻碍了我维护perl/cgi网站的能力。它通常发生在编辑脚本时-更改后,我会出现错误500,然后在我还原它后,它将不会再次工作,除非我删除文件并从头开始,但我目前有一个状态,它可以通过以下两个简单的脚本复制,这两个脚本显示此错误有多疯狂: file1.pl使用perl cgi时出现错误500-但不是任何常见陷阱,perl,cgi,Perl,Cgi,我有一个非常棘手的perl问题,它严重阻碍了我维护perl/cgi网站的能力。它通常发生在编辑脚本时-更改后,我会出现错误500,然后在我还原它后,它将不会再次工作,除非我删除文件并从头开始,但我目前有一个状态,它可以通过以下两个简单的脚本复制,这两个脚本显示此错误有多疯狂: file1.pl #! /usr/bin/perl use CGI::Carp qw(fatalsToBrowser warningsToBrowser); print "content-type: text/html\n
#! /usr/bin/perl
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
print "content-type: text/html\n\nIt works";
file2.pl
#! /usr/bin/perl
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
print "content-type: text/html\n\nIt works";
(也就是说,他们一模一样)
server.com/cgi-bin/file1.pl有效
server.com/cgi-bin/file2.pl导致错误500
两个文件具有相同的大小和md5哈希。
两者具有相同的权限(755)和相同的所有者和组。
两者都在正确的文件夹中(托管提供的cgi bin)。
都是以文本方式上传的。
两者都使用本地perl解释器
如果我重命名file1->file3、file2->file1和file3->file2(即交换两个文件),现在file2.pl工作,file1.pl不工作。所以我猜是一些状态附加到文件本身
如果我在filezilla中编辑文件并重新上载(例如在分号后添加一些空格),重新上载的文件也会发生同样的行为
“我的错误500”页面设置为使用元刷新自动重试(在内存不足错误等情况下),并且在无数次刷新后不会消失。先访问哪个似乎并不重要
我无法访问此主机上的http错误日志,因此不知道失败的原因。在没有“将错误消息用于浏览器”诊断行的情况下,也会发生此错误
有谁能给我一个提示,告诉我这可能是什么,并帮助我修复它吗?我猜:这些文件使用的不是相同的。
您可以使用来检查这一点(在Unix shell中)。您所描述的可能是由托管提供商端的某些问题(一些糟糕的缓存、透明代理或任何其他魔法)造成的,或者我认为这仍然是由错误的文件权限或换行引起的,即使您的文件管理器报告一切正常 如果我读对了你的描述,你基本上
- 你可以写一个脚本,它会工作的,但是
- 无法编辑它,因为它将在此之后停止工作
#/usr/bin/perl
严格使用;
使用警告;
打印“内容类型:文本/纯文本\n\n”;
opendir(my$dirh,“.”);
my@files=grep{-f$}readdir$dirh;
closedir$dirh;
foreach my$文件(@files){
my@stat=stat$文件;
我的($dev、$ino、$mode、$nlink、$uid、$gid、$rdev、,
$size、$atime、$mtime、$ctime、$blksize、$blocks
)=stat($file);
我的$octmode=sprintf“%04o”,$mode&07777;
打印“$file\tmode=$octmode\tuid=$uid\tgid=$gid\tsize=$size\t”;
如果(-r$file){
打开(我的$fh$文件);
我的$firstline=;
打印$firstline=~/\r\n/?“crlf\n”:“lf\n”;
收盘价$fh;
}否则{
打印“无法读取\n”;
}
}
它将显示从服务器文件系统获取的文件的实际权限、换行符和大小,而不是FTP客户端显示的
也许值得在此脚本中添加MD5或SHA1哈希计算,但不确定是否有可用的Digest::MD5
或Digest::SHA1
如果您在
test1.pl
和test2.pl
中看到相同的输出,请直接联系您的主机提供商的支持。无法检查错误日志是一个非常头痛的问题
尽管如此,我怀疑最有可能的原因仍然是行尾。我会上传一个脚本来检查您的所有文件,如下所示:
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use CGI qw(header);
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use File::stat;
print header('text/plain');
my $fmt = "%-15s %4s %4s %4s %7s %4s %4s\n";
printf $fmt, qw(File mode uid gid size lf crlf);
printf $fmt, map { '-' x $_ } $fmt =~ /(\d+)/g;
opendir my $dh, '.';
while ( my $file = readdir $dh ) {
next unless -f $file;
my $stat = stat $file;
my %chars;
my $data = do { local ( @ARGV, $/ ) = $file; <> };
$chars{$1}++ while $data =~ /(\R)/g;
printf $fmt, $file, sprintf( "%04o", $stat->mode & 07777 ), $stat->uid,
$stat->gid, $stat->size, map { $_ // 0 } @chars{ "\n", "\r\n" };
}
对于其他测试,我建议使用并检查错误条件(如果有)来执行每个脚本 我遇到了同样的问题,得到了用户BOC的帮助,如下所示: “您可能在字符编码方面有问题。某些编辑器在保存文件时会将某些字符替换为非常接近的字符(例如“by”)。请尝试更改编辑器(记事本++在windows上运行良好)。–BOC”
我下载并使用了记事本+,而不是记事本和Winword;它现在对我有效。“我无法访问此主机上的http错误日志。”“这让事情变得相当困难……你是如何上传起作用的文件的?
file1.pl
这个问题敲响了警钟……我肯定我在某处或类似的地方读到过。你用谷歌搜索过它吗?是的,我用谷歌搜索过它——我收到了数百页关于“确保755”或“确保ascii”或“确保在配置的cgi bin中”,以及我列出并检查的所有其他新手错误。都是从ftp上传的。如果文件具有相同的哈希值,则不太可能出现这种情况。我无法访问shell,因此无法执行该命令。-但它们在服务器上都具有相同的文件大小(以字节为单位),因此没有CRLF和LF不匹配。是否有远程文件系统(NFS、CIFS等)正在使用?您使用哪个操作系统来比较大小和哈希,Web服务器使用哪个操作系统?您可以编写一个CGI脚本来比较两个脚本的文件大小、哈希和权限吗?类似于atycnth的?
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use CGI qw(header);
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use File::stat;
print header('text/plain');
my $fmt = "%-15s %4s %4s %4s %7s %4s %4s\n";
printf $fmt, qw(File mode uid gid size lf crlf);
printf $fmt, map { '-' x $_ } $fmt =~ /(\d+)/g;
opendir my $dh, '.';
while ( my $file = readdir $dh ) {
next unless -f $file;
my $stat = stat $file;
my %chars;
my $data = do { local ( @ARGV, $/ ) = $file; <> };
$chars{$1}++ while $data =~ /(\R)/g;
printf $fmt, $file, sprintf( "%04o", $stat->mode & 07777 ), $stat->uid,
$stat->gid, $stat->size, map { $_ // 0 } @chars{ "\n", "\r\n" };
}
Content-Type: text/plain; charset=ISO-8859-1
File mode uid gid size lf crlf
--------------- ---- ---- ---- ------- ---- ----
env.cgi 0775 0 0 266 25 0
le.pl 0775 501 0 696 28 0
lineendings.pl 0755 501 0 516 30 0
mywiki.pl 0755 501 0 226947 0 6666
test.cgi 0755 0 0 2071 65 0
wiki.pl 0755 0 0 219231 6494 0