动态生成使用 mod_perl 在 Apache 中构建

动态生成使用 mod_perl 在 Apache 中构建

我需要让我的 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是一个部门的名称,这是一个项目的名称。如果我转到目录中使用的$2URL 。每个位置都有不同的 URL ,如果 URL 未转换为文件系统路径,则会显示正常的 404,否则它将无法工作。这样,我可以创建一个单一的模式,而不必维护大量的s,也不必每次进行更改时都重新加载服务器。mydomain.com/financial/accountsusers.file/sites/financial/accountsusers.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>。如果您现有的指令有足够的结构,那么应该可以用一个正则表达式来匹配它们。

相关内容