3

パス X または apache vhosts 構成ファイルのコピーが与えられた場合、PHP を使用してそのファイルを解析するにはどうすればよいですか?

たとえば、Apache vhosts 構成の内容を含む文字列を含む変数が与えられた場合、ホストされているドメイン/サブドメインのエイリアスのリストを取得するにはどうすればよいでしょうか?

たとえば、次のようになります。

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80



<VirtualHost *:80>
    ServerAdmin contact@tomjn.com
    DocumentRoot "/srv/www/localhost/

    ServerName 127.0.0.1
    ServerAlias localhost
    CustomLog "/srv/www/logs/localhost-access_log.log" combined
    ErrorLog "/srv/www/logs/localhost-error_log.log"

    <Directory "/srv/www/localhost">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin contact@tomjn.com
    DocumentRoot "/srv/www/2.7.localhost.com/

    ServerName 2.7.localhost.com
    ServerAlias 2.7.localhost.com
    CustomLog "/srv/www/logs/2.7.localhost.com-access_log.log" combined
    ErrorLog "/srv/www/logs/2.7.localhost.com-error_log.log"

    <Directory "/srv/www/2.7.localhost.com">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

この出力を取得するにはどうすればよいですか:

  • ローカルホスト
  • 2.7.localhost.com

Python で書かれた非常に近いものを次に示します。

http://www.poldylicious.de/system/files/apacheconfig.py.txt

4

4 に答える 4

6
# Get Vhosts files
$path       = '/etc/apache2/sites-enabled'; # change to suit your needs
$a_directory = scandir($path);
$a_conf_files = array_diff($a_directory, array('..', '.'));
$info = array(); $x=0;

foreach($a_conf_files as $conf_file){
 $Thisfile   = fopen($path .'/'.$conf_file, 'r')or die('No open ups..');

    while(!feof($Thisfile)){
        $line = fgets($Thisfile);
        $line = trim($line);

       // CHECK IF STRING BEGINS WITH ServerAlias
        $tokens = explode(' ',$line);

        if(!empty($tokens)){
            if(strtolower($tokens[0]) == 'servername'){
                $info[$x]['ServerName'] = $tokens[1];
            }
            if(strtolower($tokens[0]) == 'documentroot'){
                $info[$x]['DocumentRoot'] = $tokens[1];
            }
            if(strtolower($tokens[0]) == 'errorlog'){
                $info[$x]['ErrorLog'] = $tokens[1];
            }
            if(strtolower($tokens[0]) == 'serveralias'){
                $info[$x]['ServerAlias'] = $tokens[1];
            }

        }else{
            echo "Puked...";
        }
    }

fclose($file);
$x++;
}

print_r($info);

出力:

Array
(
    [0] => Array
        (
            [ServerName] => bootstrap
            [ServerAlias] => BootstrapProject
            [DocumentRoot] => /data/sites/bootstrap/htdocs
            [ErrorLog] => /data/sites/bootstrap/log/error.log
        )

    [1] => Array
        (
            [ServerName] => localhost
            [ServerAlias] => dfs
            [DocumentRoot] => /data/sites/scott/htdocs
            [ErrorLog] => /data/sites/scott/log/error.log
        )

    [2] => Array
        (
            [ServerName] => wordpress
            [ServerAlias] => wordpress
            [DocumentRoot] => /data/sites/wordpress/public_html
            [ErrorLog] => /data/sites/wordpress/log/error.log
        )

)
于 2014-03-19T17:35:47.797 に答える
1

うーん、これが基づいていた答えは消えた/削除されました.何らかの理由で、これが私の最終版です:

<?php
function return_server_alias($fileName){
    $file = fopen($fileName,'r');
    $servers = array();
    while(!feof($file)) { 
        $line = fgets($file);
        // STRIP WHITE SPACE HERE
        $line = trim($line);
        // CHECK IF STRING BEGINS WITH ServerAlias
        $tokens = explode(' ',$line);
        if(!empty($tokens)){
            if(strtolower($tokens[0]) == 'serveralias'){
                $servers[] = $tokens[1];
            }
        }
    }
    fclose($file);
    return $servers;
}
于 2013-01-08T17:38:42.620 に答える
1

私が見つけた限り、そのような利用可能なライブラリはありません。簡単な解決策が必要な場合は、正規表現を使用してすべての仮想ホストを見つけ、その上で正規表現を使用してすべての変数とその値を見つけることができます。<Directory>ただし、 vhost 定義内などには注意が必要です。

于 2013-01-08T14:05:57.120 に答える
-1

あなたの仮想ホストからより多くの情報を取得するための私のやり直しは次のとおりです。

<pre><?php

    # Get Vhosts files
    $path       = '/etc/apache2/sites-enabled'; # change to suit your needs
    $a_directory = scandir($path);
    $a_conf_files = array_diff($a_directory, array('..', '.'));
    $info = array(); $x=0;`enter code here`

    foreach($a_conf_files as $conf_file){
     $Thisfile   = fopen($path .'/'.$conf_file, 'r')or die('No open ups..');

        $info[$x]['VHostFile'] = $conf_file;
        while(!feof($Thisfile)){
            $tokens = array();
            $line = fgets($Thisfile);
            $line = trim($line);

            if(preg_match('/\s*#+.*/',$line))
                $info[$x]['Commentaires'][] = $line;
            else
    {


            if(count($tokens)==3){
                if(strtolower($tokens[1]) == 'servername'){
                    $info[$x]['ServerName'][] = $tokens[2];
                    $index[$tokens[2]] = $x;
                }
                elseif(strtolower($tokens[1]) == 'documentroot'){
                    $info[$x]['DocumentRoot'] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'errorlog'){
                    $info[$x]['ErrorLog'] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'serveralias'){
                    $info[$x]['ServerAlias'][] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'virtualhost'){
                    $info[$x]['VirtualHost'] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'loglevel'){
                    $info[$x]['LogLevel'] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'assignuserid'){
                    $info[$x]['AssignUserId'] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'ifmodule'){
                    $info[$x]['IfModule'][] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'directory'){
                    $info[$x]['Directory'][] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'serveradmin'){
                    $info[$x]['ServerAdmin'] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'options'){
                    $info[$x]['Options'] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'indexoptions'){
                    $info[$x]['IndexOptions'] = $tokens[2];
                }
                elseif(strtolower($tokens[1]) == 'alias'){
                    $info[$x]['Alias'][] = $tokens[2];
                }
                elseif(!empty($tokens[1]))
                    $info[$x]['Autre'][$tokens[1]] = $tokens[2];

            }elseif(!empty($line)){
                $info[$x]['Illisible'][] = $line;
            }
    }
        }

    fclose($Thisfile);
    $x++;
    }

    echo var_export($index,true);

    echo var_export($info,true);

?></pre>
于 2014-11-05T17:21:31.413 に答える