我将运行多个子域,最终太多子域无法拥有自己的配置文件。我让虚拟主机按我想要的方式工作,因此每个子域都有自己的文件夹,例如 /web/test 将为该子域提供网页。我想让每个子域都有自己的 SVN 和 trac 项目,例如 http://test.mastersiege.com/trac 问题是你不能在 apache 中使用变量。
<Location /trac>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /var/trac/$1
PythonOption TracUriRoot /trac
</Location>
其中 $1 = 子域。而且我无法将 trac 文件夹符号链接到子域主文件夹中,然后将 vhost_alias 的文档根用作 TracEnv。我尝试在 apache 配置文件中编写一个 Perl 脚本,该脚本从 URL 解析子域,就像在 Vhost 容器中动态使用带有 mod_perl 的 URL但它没有 用
use Apache2::ServerRec () ;
use Apache2::ServerUtil ();
use Apache2::RequestRec ();
use Apache2::RequestUtil ();
use Apache2::Const qw/OK DECLINED/;
my $s = Apache2::ServerUtil->server;
$s->push_handlers(PerlHeaderParserHandler => sub { my($r) = @_;
if ( $r->hostname =~ m/(.*)\.([^.]+\.\w+)$/ ) {
my($subdomain,$domain) = ($1,$2);
my($TracPath) = "TracEnv /srv/trac/"+$subdomain;
my($TracUri) = "TracUriRoot /testTrac";
$Location{"/testTrac/"} = {
SetHandler => "mod_python",
PythonInterpreter => "main_interpreter",
PythonHandler => "trac.web.modpython_frontend",
PythonOption => $TracPath,
PythonOption => $TracUri
};
if ( $@ ) { warn $@ }
return OK;
} else {
return DECLINED;
}
});
</Perl>
那是我的第一个 perl 脚本,所以我不确定.. 可以使用 cgi for trac 来解决问题,但它比 mod_python 慢 100 倍
我会将 mod_python 更改为 mod_wsgi。在此配置中,您可以使用环境变量设置 TRAC_PATH。
示例静态配置的一些摘录:
您必须测试并确定如何将 RewriteRule 中的子域或域获取到 [E=...]。
您可以在设置 env 时使用模式中的反向引用(例如
[E=trac.env_path:%1]
。我不确定您是否可以在那里使用其他 env 变量[E=trac.env_path:%{HTTP_HOST}]
,文档对此没有说明。我想您应该能够做到这一点。如果没有,那么 RewriteRules 的更多魔法可能会有所帮助。trac-stable.wsgi 供参考:
后来的想法 - 如果无法使用,
[E=trac.env_path:%{HTTP_HOST}]
那么您可以使用 env 变量传递尽可能多的内容,并在 trac-stable.wsgi 中构造 env.env_path。