Используйте CGI-скрипт в качестве провайдера изображений с возможностью кеширования - PullRequest
2 голосов
/ 24 июля 2011

Я пытаюсь использовать сценарий 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 Ответ

1 голос
/ 24 июля 2011

Не похоже, что у вас есть конкретный вопрос.Я предполагаю, что вы запрашиваете совет о том, как правильно написать скрипт CGI.

Я не понимаю, почему для этого нужно писать скрипт CGI.Просто настройте свой веб-сервер правильно, чтобы добавить expires и Etag информацию.

Вы должны добавить use warnings; и use strict; к вашему сценарию, запустить его в режиме 'taint', а неиспользуйте $ENV{QUERY_STRING} напрямую, но обращайтесь к переменным, предоставленным с использованием CGI.pm param метода и т. д.

Я не понимаю, почему LWP::UserAgent появляется, почему вы выдаете GET.

Возможно, вы сможете объяснить, почему вы делаете то, что делаете, и сформулировать конкретный вопрос в соответствии с характером вопросов и ответов на этом сайте.

Кроме того, вы можете прочитать Как(и как нет) для контроля кэшей .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...