我需要让我的 Apache 网络服务器通过结构为大量网站提供服务<Location />
。我最不想要的是一个包含<Location />
每个网站的每个结构(甚至不是生成的结构)的庞大文件。我一直在研究mod_rewrite
一些适用于 Apache 的大规模虚拟主机模块,但不幸的是,我没有找到我想要的东西。
前几天,我在研究mod_perl
,据我所知,我可以使用它mod_perl
来“编写”Apache Web 服务器。这让我怀疑这是否是我一直在寻找的解决方案?我一直在寻找我的问题的具体示例,但似乎找不到任何具体的东西。
我的问题是,我可以在多大程度上mod_perl
生成我的<Location />
结构按请求时间在执行此操作时我可以访问哪些类型的变量?
更新:
为了清楚起见,我想举一个例子来说明我正在尝试做的事情。我知道以下示例不正确,但我正在寻找一种方法来执行此类操作(在请求时):
<Location /$1/$2>
AuthType Basic
AuthName "Secure area"
AuthUserFile /sites/$1/$2/users.file
</location>
所以我想要的是;想象一下,这$1
是一个部门的名称,这是一个项目的名称。如果我转到目录中使用的$2
URL 。每个位置都有不同的 URL ,如果 URL 未转换为文件系统路径,则会显示正常的 404,否则它将无法工作。这样,我可以创建一个单一的模式,而不必维护大量的s,也不必每次进行更改时都重新加载服务器。mydomain.com/financial/accounts
users.file
/sites/financial/accounts
users.file
<location />
<location />
答案1
我还没有尝试过您的具体用例,但您可能想尝试 mod_perl 和:
<Perl>
foreach (</sites/*/*/users.file>) {
my $loc = $_;
$loc =~ s/^\/sites(.*)\/users\.file/$1/;
$Location{$loc} = {
AuthType => "Basic",
AuthName => "Secure area",
AuthUserFile => $_,
};
}
</Perl>
不过,每次添加新的“users.file”时,您仍然需要重新加载 Apache。如果您确实需要动态执行此操作,则应该构建 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;
答案2
您的意思是根据站点将 HTTP 请求定向到不同的 DocumentRoot、ScriptAlias 和 CustomLog,还是需要更复杂的操作?您能否提供有关 Location 指令的更多详细信息?
值得尝试的是 mod_macro (http://www.coelho.net/mod_macro/)
答案3
你已经看过使用<LocationMatch>
?
它是 的正则表达式老大哥<Location>
。如果您现有的指令有足够的结构,那么应该可以用一个正则表达式来匹配它们。