使用CGI脚本作为具有缓存能力的图像提供者

时间:2011-07-24 18:21:40

标签: perl caching cgi

我正在尝试使用CGI脚本充当我的应用程序资产的静态提供程序。由于我对Perl相对较新,我认为我的代码不是达到我想要的最佳方式。如果你有更好的代码,请告诉我。这是我最近的剧本

#!/usr/bin/perl
use lib "/usr/share/perl/5.10.1";
$asset_path = "/home/foo/public_html/assets/img/";
$uri_asset_path = "http://v2.foo.com/assets/img/";
use File::stat;
use Time::localtime;
$ENV{QUERY_STRING}=~ s/:/\//g;
$file = $asset_path . $ENV{QUERY_STRING};
unless (-e $file) {
print header('text/html','404 Not Found'); 
exit();
} 
$raw_last_modified = ctime(stat($file)->mtime);
$age = 30*24*60*60;
$date_day = substr $raw_last_modified, 0, 3;
$date_mon = substr $raw_last_modified, 4, 3;
$date_mon = substr $raw_last_modified, 4, 3;
$date_d = substr $raw_last_modified, 8, 2;
$date_time = substr $raw_last_modified, 11, 8;
$date_year = substr $raw_last_modified, 20, 4;
$last_modified = "$date_day, $date_d $date_mon $date_year $date_time GMT";
use CGI qw/:standard/;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $response = $ua->get("$uri_asset_path/$ENV{QUERY_STRING}");
unless ($response->is_success){
    print header('text/html','404 Not Found'); 
    exit();
}
if(defined($ENV{'HTTP_IF_MODIFIED_SINCE'})){
    if ($ENV{'HTTP_IF_MODIFIED_SINCE'} == $last_modified){
        print header('text/html','304 Not Modified');
        return();
    } 
}
print header(-type=>'image/png',-expires=>'+30d',-last_modified => $last_modified,-cache_control => 'max-age='.$age.', must-revalidate');
print $response->content;

感谢。

1 个答案:

答案 0 :(得分:1)

看起来你没有具体问题。我假设您正在征求关于如何正确编写CGI脚本的建议。

我不明白为什么需要为此编写CGI脚本。只需正确配置您的网络服务器,即可添加expiresEtag信息。

您应该在脚本中添加use warnings;use strict;,在“污点”模式下运行,不要直接使用$ENV{QUERY_STRING},而是使用CGI.pm提供的访问变量param方法等。

我不明白为什么LWP::UserAgent出现,为什么要发出GET

也许你可以解释为什么你正在做你正在做的事情,并根据本网站的Q& A性质制定一个特定的问题。

此外,您可能需要阅读How (and how not) to Control Caches