好吧,事实证明这不起作用的原因是因为我完全忘记了我没有在标准 cgi_bin 目录之外使用 CGI 进行操作。相反,我使用 .htaccess 文件告诉服务器如何以及何时将根目录中的文件解释为 cgi。
所以,这就是我最终在我的图像碟形脚本中使用的:
imagedish.pm
use CGI;
my $cgi = new CGI;
open (IMAGE, 'logo.png');
my $size = -s "logo.png";
my $data;
read IMAGE, $data, $size;
close (IMAGE);
print $cgi->header(-type=>'image/png'), $data;
这成功了,就像它从一开始就应该做的那样,但是在我的 .htaccess 文件中,我添加了:
<files imagedish.pm>
SetHandler cgi-script
</files>
这就是诀窍(嗯,那个,以及进入终端并运行 chmod +x imagedish.pm 以使其可执行)!当然,接下来的步骤是额外的安全措施,但至少它现在正在工作!:-)
完整的解决方案:主文件:
!/usr/bin/perl
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Session qw/-ip-match/;
use DBI;
use strict;
use warnings;
# Variables
my $query = CGI->new();
my %vars = $query->Vars();
sub main {
my $p1 = $vars{p1};
$p1 = 'Home' if (!$p1);
my $html = get_page();
#I use this method in case we have multiple sessions
#I've omitted how I acquire the session, as this is not part of the solution ;-)
print $query->header(-cookie=>[$query->cookie($vars{p1}=>$session->id)]);
print $html;
}
sub get_page {
return <<HTML;
<!DOCTYPE HTML>
<html>
<head>
<title>Image Disher</title>
<link rel="shortcut icon" href="images/favicon.ico" />
<link href="css/style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="container">
<div class="addentry">
<div class="iaddentry">
<form name="client" action="" method="POST">
<div class="form-header" action="">
<center>
<img src="imagedish.pm" width="305" alt=""/><br>
</center>
<br>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
HTML
}
main();
在这里,img 标签查找源“imagedish.pm”,一旦找到,.htaccess 文件会告诉它作为 CGI 脚本执行。那时,它会适当地提供信息,而不是像以前那样。
请注意,这不是最安全的方法,但它让我朝着正确的方向前进。