使用perl cgi时出现错误500-但不是任何常见陷阱

使用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

我有一个非常棘手的perl问题,它严重阻碍了我维护perl/cgi网站的能力。它通常发生在编辑脚本时-更改后,我会出现错误500,然后在我还原它后,它将不会再次工作,除非我删除文件并从头开始,但我目前有一个状态,它可以通过以下两个简单的脚本复制,这两个脚本显示此错误有多疯狂:

file1.pl

#! /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中)。

您所描述的可能是由托管提供商端的某些问题(一些糟糕的缓存、透明代理或任何其他魔法)造成的,或者我认为这仍然是由错误的文件权限或换行引起的,即使您的文件管理器报告一切正常

如果我读对了你的描述,你基本上

  • 你可以写一个脚本,它会工作的,但是
  • 无法编辑它,因为它将在此之后停止工作
由于您没有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