2015-04-04 73 views
0

我有靜態的虛擬主機配置象下面這樣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列表

在此先感謝。

回答

0

這個問題可能屬於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 . "\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