我需要通过<Location />结构为我的Apache Web服务器提供大量的站点。 我想要的最后一件事情是一个庞大的文件,每个站点都有一个<Location />结构(甚至没有生成一个)。 我一直在研究mod_rewrite和一些可用于Apache的大量虚拟主机模块,但不幸的是,我没有find我正在寻找的东西。
有一天,我正在调查mod_perl ,据我所知,我可以使用mod_perl '脚本'的Apache Web服务器。 这让我怀疑这是我一直在寻找的解决scheme? 我一直在四处搜寻我的问题的具体例子,但我似乎无法find任何具体的东西。
我的问题是,在什么情况下,我可以在请求时使用mod_perl生成我的<Location />结构,并且在执行此操作时可以访问哪些variables?
更新 :
为了清楚起见,我想举一个我想要做的事情的例子。 我知道下面的例子是不正确的,但我正在寻找一种方式来做这样的事情(在请求时):
<Location /$1/$2> AuthType Basic AuthName "Secure area" AuthUserFile /sites/$1/$2/users.file </location>
所以我想要的是 想象一下, $1是一个部门的名称, $2是一个项目的名称。 如果我要去使用目录/sites/financial/accounts中的users.file的urlmydomain.com/financial/accounts 。 每个位置都有一个不同的users.file ,如果url不能转换成文件系统path,则会显示一个正常的404或者它不起作用。 这样我就可以创build一个单独的<location />模式,而不必维护大量的<location />并且在每次进行更改时都必须重新加载服务器。
我还没有尝试过你的具体用例,但是你可能想用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。 如果你真的需要dynamic的做,你应该build立一个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;
你的意思是根据网站的HTTP请求指向不同的DocumentRoot,ScriptAlias和CustomLog,或者你需要更复杂的东西? 你能提供关于你的位置指令的更多细节吗?
值得尝试的东西可能是mod_macro( http://www.coelho.net/mod_macro/ )
你已经看过使用<LocationMatch> ?
这是<Location>的正则expression式大哥。 如果现有的指令有足够的结构,那么应该可以将它们与一个正则expression式匹配。