Назад | Перейти на главную страницу

Dynamically generating <location> конструкции в Apache с использованием mod_perl</location>

Мне нужно, чтобы мой веб-сервер Apache обслуживал множество сайтов через <Location /> конструкции. Меньше всего мне нужен массивный файл с каждым <Location /> структура для каждого отдельного сайта (даже не созданного). Я изучал mod_rewrite и некоторые из массовых модулей виртуального хостинга, доступных для Apache, но, к сожалению, я не нашел то, что искал.

На днях я изучал mod_perl и насколько я понимаю, я могу использовать mod_perl «сценарий» веб-сервера Apache. Это заставило меня задуматься, является ли это решение, которое я искал? Я искал конкретные примеры своей проблемы, но не могу найти ничего конкретного.

Мой вопрос в том, насколько я могу mod_perl генерировать мой <Location /> структуры во время запроса и к каким переменным у меня есть доступ при этом?

ОБНОВИТЬ:

Для ясности я хотел бы привести пример того, что я пытаюсь делать. Я знаю, что следующий пример неверен, но я ищу способ сделать что-то вроде этого (во время запроса):

<Location /$1/$2>
   AuthType Basic
   AuthName "Secure area"
   AuthUserFile /sites/$1/$2/users.file
</location>

Так что я хочу: Представьте себе, что $1 это название отдела, и это $2 это название проекта. Если бы я пошел по URL-адресу mydomain.com/financial/accounts что users.file из каталога /sites/financial/accounts используется. У каждого места разные users.file и если URL-адрес не переводится в путь к файловой системе, отображается обычный 404 или он просто не работает. Таким образом я могу создать сингл <location /> шаблон без необходимости поддерживать большое количество <location />s и необходимости перезагружать сервер каждый раз, когда я вношу изменения.

Вы имели в виду направление HTTP-запросов в соответствии с сайтом на другой DocumentRoot, ScriptAlias ​​и CustomLog, или вам нужно что-то более сложное? Не могли бы вы предоставить более подробную информацию о ваших директивах о местоположении?

Что-то стоящее может быть mod_macro (http://www.coelho.net/mod_macro/)

Я не пробовал ваш конкретный вариант использования, но вы можете поэкспериментировать с mod_perl и:

<Perl>
foreach (</sites/*/*/users.file>) {
    my $loc = $_;
    $loc =~ s/^\/sites(.*)\/users\.file/$1/;
    $Location{$loc} = {
        AuthType => "Basic",
        AuthName => "Secure area",
        AuthUserFile => $_,
    };
}
</Perl>

Однако вам все равно придется перезагружать Apache каждый раз, когда вы добавляете новый файл «users.file». Если вам действительно нужно делать это динамически, вам следует вместо этого создать PerlAuthenHandler:

<Location /> # we need for any request to the site
    PerlAuthenHandler MyApache2::DynamicAuthUserFile
    AuthType Basic
    AuthName "Secure area"
</Location>

и MyApache2/DynamicAuthUserFile.pm сценарий, похожий на этот:

package MyApache2::DynamicAuthUserFile;

use strict;
use warnings;

use Apache::RequestRec ();
use Apache::Access ();

use Apache::Const -compile => qw(OK DECLINED);

sub handler {
    my $r = shift;
    my ($status, $password) = $r->get_basic_auth_pw;
    return $status if $status != Apache::OK;
    my $user = $r->user;

    my $file = $r->uri;
    $file =~ s|^/sites/([^/]*/[^/])*|$1/users.file|;

    if (open(P, $file)) {
        while (<P>) {
            chomp;
            next if /^#/;
            my ($name,$saved_pw) = split /:/;
            next if $user ne $name;
            if ($saved_pw ne crypt($passwd,$saved_pw)) {
                last;
            }
            return Apache::Const::OK;
        }
        close P;
    }

    return Apache::Const::DECLINED;
}

1;

Вы уже смотрели на использование <LocationMatch>?

Это старший брат регулярного выражения <Location>. Если в ваших существующих директивах достаточно структуры, то должно быть возможно сопоставить их с одним регулярным выражением.