我在httpd.conf
文件中有如下静态虚拟主机配置:
<VirtualHost 127.0.0.1:80 >
DocumentRoot "D:/xampp/htdocs/work/cms.com"
ServerAlias website1.com website2.com
</VirtualHost >
工作正常,两个域都显示
website1.com --> cms.com/index.html file.
website2.com --> cms.com/index.html file.
但我需要mysql数据库中的ServerAlias列表。
提前感谢。
这个问题可能属于ServerFault,但以下是您使用mod_perl完成的答案。可能是最简单的方法。实际上,您可以在httpd.conf中添加一个Perl代码部分。类似这样的东西:
<Perl>
# database configuration
my %dbcfg = (
server => 'localhost',
database => 'httpd',
user => 'apache',
pass => 'wRu3REfr'
);
my %host = (
http_tmpl => '/srv/httpd/conf/templates/http.tmpl',
dav_tmpl => '/srv/httpd/conf/templates/webdav.tmpl',
ftp_tmpl => '/srv/httpd/conf/templates/ftp.tmpl',
path => '/srv/hosts'
);
# modules
use strict;
use warnings;
use DBI; # DBI + DBD MySQL Driver
use Apache2::PerlSections; # Apache2::PerlSection is needed for add_config
# read templates
open(TMPL, $host{'http_tmpl'}) or die "Can't read http template";
$host{'http_tmpl'} = '';
while (<TMPL>){
chomp;
$host{'http_tmpl'} = $host{'http_tmpl'} . $_ . "n";
}
close(TMPL);
open(TMPL, $host{'dav_tmpl'}) or die "Can't read dav template";
$host{'dav_tmpl'} = '';
while (<TMPL>){
chomp;
$host{'dav_tmpl'} = $host{'dav_tmpl'} . $_ . "n";
}
close(TMPL);
open(TMPL, $host{'ftp_tmpl'}) or die "Can't read ftp template";
$host{'ftp_tmpl'} = '';
while (<TMPL>){
chomp;
$host{'ftp_tmpl'} = $host{'ftp_tmpl'} . $_ . "n";
}
close(TMPL);
# apache server hook
my $srv = Apache2::PerlSections->server();
# database connection
my $dbh = DBI->connect(
'DBI:mysql:'.$dbcfg{'database'}.':'.$dbcfg{'server'},
$dbcfg{'user'},
$dbcfg{'pass'}
);
if(not $dbh){
print "Can't connect to mysql server!n";
die $DBI::errstr;
}
# fetch hosts
my $hosts = $dbh->prepare(q{
SELECT hosts.id, name, IF( ISNULL( configuration), '', configuration) configuration, webdav, ftp, cgi, ssi, php
FROM hosts
LEFT JOIN configuration ON (configuration.id = hosts.id)
WHERE enabled = 1
ORDER BY hosts.id ASC;
}) or die $dbh->errstr;
# generate vhosts
$hosts->execute;
while ( (my $id,my $name,my $cfg,my $bDAV,my $bFTP,my $bCGI,my $bSSI,my $bPHP) = $hosts->fetchrow_array() ) {
# generate aditional configuration
if ($bSSI == 1) {
my $ssi = '';
$ssi = $ssi . "t<IfModule mod_include.c>n";
$ssi = $ssi . "ttAddType text/html .shtml .shtmn";
$ssi = $ssi . "ttAddOutputFilter INCLUDES .shtml .shtmn";
$ssi = $ssi . "t</IfModule>n";
$cfg = $ssi . $cfg;
}
if ($bCGI == 1) {
my $cgi = '';
$cgi = $cgi . "tScriptAlias /cgi-bin/ "%host_dir%/%name%/cgi-bin/"n";
$cgi = $cgi . "t<Directory "%host_dir%/%name%/cgi-bin">n";
$cgi = $cgi . "ttAllowOverride Nonen";
$cgi = $cgi . "ttOptions Nonen";
$cgi = $cgi . "ttOrder allow,denyn";
$cgi = $cgi . "ttAllow from alln";
$cgi = $cgi . "t</Directory>n";
$cgi = $cgi . "t<IfModule mod_cgi.c>n";
$cgi = $cgi . "ttAddHandler cgi-script .cgi .pln";
$cgi = $cgi . "t</IfModule>n";
$cgi = $cgi . "t<IfModule mod_cgid.c>n";
$cgi = $cgi . "ttAddHandler cgi-script .cgi .pln";
$cgi = $cgi . "t</IfModule>n";
$cfg = $cgi . $cfg;
}
if ($bPHP == 1) {
my $php = '';
$php = $php . "t<IfModule mod_php5.c>n";
$php = $php . "ttAddHandler application/x-httpd-php .phpn";
$php = $php . "ttAddHandler application/x-httpd-php-source .phpsn";
$php = $php . "t</IfModule>n";
$cfg = $php . $cfg;
}
# get aliases
my $aliases = '';
my $alias = $dbh->prepare(q{
SELECT alias
FROM aliases
WHERE id = ?;
}) or die $dbh->errstr;
$alias->execute($id);
while ( (my $n) = $alias->fetchrow_array() ) {
$aliases = $aliases . " " . $n;
}
if ($aliases ne '') {
$aliases = "ServerAlias" . $aliases;
}
# validate documentroot
if(!-d "$host{'path'}/$name"){
mkdir("$host{'path'}/$name", 0755);
mkdir("$host{'path'}/$name/_sys", 0755);
mkdir("$host{'path'}/$name/_sys/logs", 0755);
mkdir("$host{'path'}/$name/_sys/tmp", 0755); #for php temp directory
mkdir("$host{'path'}/$name/_sys/sessions", 0755); #for php sessions directory
mkdir("$host{'path'}/$name/httpdocs", 0755);
mkdir("$host{'path'}/$name/cgi-bin", 0755);
system('chown -R apache:apache "'.$host{'path'}.'/'.$name.'"');
}
# create vhost
my $vhost = $host{'http_tmpl'};
if ($bDAV == 1) {
$vhost = $vhost . "n" . $host{'dav_tmpl'};
}
if ($bFTP == 1) {
$vhost = $vhost . "n" . $host{'ftp_tmpl'};
}
$vhost =~ s/%id%/$id/g;
$vhost =~ s/%cfg%/$cfg/g;
$vhost =~ s/%host_dir%/$host{'path'}/g;
$vhost =~ s/%name%/$name/g;
$vhost =~ s/%aliases%/$aliases/g;
$vhost =~ s/%db_server%/$dbcfg{'server'}/g;
$vhost =~ s/%db_name%/$dbcfg{'database'}/g;
$vhost =~ s/%db_user%/$dbcfg{'user'}/g;
$vhost =~ s/%db_pass%/$dbcfg{'pass'}/g;
# push vhosts to apache
$srv->add_config([split /n/, $vhost]);
# debugging
#print "----" . $name . "----n";
#print $vhost;
}
# cleanup
$dbh->disconnect();
</Perl>
http://wiki.apache.org/httpd/ApacheVirtualHostMysql