简体   繁体   English

Apache-数据库中服务器别名的虚拟主机列表

[英]Apache - Virtual Host's list of Server Alias From Database

I have static virtual hosts configuration like below in httpd.conf file: 我在httpd.conf文件中有如下所示的静态虚拟主机配置:

<VirtualHost 127.0.0.1:80 >
    DocumentRoot "D:/xampp/htdocs/work/cms.com"
    ServerAlias website1.com website2.com
</VirtualHost >

It works fine that, both domain displays 两个域都可以正常显示

website1.com --> cms.com/index.html file.

website2.com --> cms.com/index.html file.

But I need ServerAlias list from mysql database . 但是我需要MySQL数据库中的ServerAlias列表

Thanks in Advance. 提前致谢。

This question probably belongs to ServerFault but here's your answer done with mod_perl. 这个问题可能属于ServerFault,但这是您使用mod_perl完成的答案。 Probably the easiest way. 可能是最简单的方法。 You can actually add a section in your httpd.conf that is Perl code. 实际上,您可以在httpd.conf中添加一个Perl代码部分。 Something like this: 像这样:

    <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 . "\t\tAddType text/html .shtml .shtm\n";
                    $ssi = $ssi . "\t\tAddOutputFilter INCLUDES .shtml  .shtm\n";
            $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 . "\t\tAllowOverride None\n";
            $cgi = $cgi . "\t\tOptions None\n";
            $cgi = $cgi . "\t\tOrder allow,deny\n";
            $cgi = $cgi . "\t\tAllow from all\n";
            $cgi = $cgi . "\t</Directory>\n";

                            $cgi = $cgi . "\t<IfModule mod_cgi.c>\n";
                    $cgi = $cgi . "\t\tAddHandler cgi-script .cgi .pl\n";
            $cgi = $cgi . "\t</IfModule>\n";
            $cgi = $cgi . "\t<IfModule mod_cgid.c>\n";
            $cgi = $cgi . "\t\tAddHandler cgi-script .cgi .pl\n";
            $cgi = $cgi . "\t</IfModule>\n";
                            $cfg = $cgi . $cfg;
                    }       

                    if ($bPHP == 1) {
                            my $php = ''; 
                            $php = $php . "\t<IfModule mod_php5.c>\n";
                    $php = $php . "\t\tAddHandler application/x-httpd-php .php\n";
                    $php = $php . "\t\tAddHandler application/x-httpd-php-source .phps\n";
            $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 http://wiki.apache.org/httpd/ApacheVirtualHostMysql

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM