Мне нужно, чтобы мой веб-сервер 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>
. Если в ваших существующих директивах достаточно структуры, то должно быть возможно сопоставить их с одним регулярным выражением.