Перейти к содержимому

SSI и Last-Modified

Не секрет, что Apache по умолчанию не отдаёт заголовок Last-Modified для документов с SSI. Штатными средствами предлагается использовать команду XBitHack full для выдачи этого заголовка. Однако, это требует установки битов прав доступа для всех таких файлов, что зачастую не совсем удобно.

Если же вы используете Apache вместе со втроенным интерпретатором языка Perl, mod_perl, то эту проблему можно решить и без использования команды XBitHack, при помощи этого модуля:


package Apache::FLastMod;

use strict;
use Apache::Constants qw(:common);
use Apache::File ();
use Date::Manip;

sub handler {
my $r = shift;
return DECLINED unless substr($r->content_type(), 0, 9) eq 'text/html';

my $file = $r->filename;
my $modtime = (stat($file))[9];
my $lm = &UnixDate(&DateCalc("Jan 1, 1970  00:00:00 GMT", $modtime), "%a, %d %b %Y %H:%M:%S GMT");
$r->err_header_out('Last-Modified' => $lm);
my $meta = "<meta http-equiv=\"Last-Modified\" content=\"$lm\">\n";

my $fh;
unless ($fh = Apache::File->new($file)) {
$r->log_error("Couldn't open $file for reading: $!");
return SERVER_ERROR;
}

$r->send_http_header;

my $header = '<!-- FLastMod was here -->';

while(<$fh>) {
s!(<body [^>]*>)!$1$header!oi;
s!(</head[^>]*>)!$meta$1!oi;
s/<meta http-equiv=\"Content-Type\".*>/<!-- meta stripper was here -->/oi;
} continue {
$r->print($_);
}

return OK;
}

1;
__END__

Подключается этот модуль в конфиге сервера следующим образом:


<Files ~ "\.shtml">
SetHandler perl-script
PerlHandler Apache::FLastMod
</Files>

NB: этот модуль также вырезает заголовок META.Content-Type.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *