使用 httpd.conf 建立網域列表

使用 httpd.conf 建立網域列表

我正在嘗試建立一個 bash 腳本,該腳本可以產生一個文件,其中包含 Web 伺服器託管的完整網域清單(來自 Apache 的設定檔)。

實際上看起來很簡單。據我所知,ServerName 和 ServerAlias 是產生此清單所必需的關鍵指令。

讓我困惑的是可能有多個別名。

一個範例條目。

<VirtualHost IP_ADDR:PORT>
    ServerName domain-1.tld
    ServerAlias www.domain-1.tld
    DocumentRoot /home/domain-1.tld/public_html
    ServerAdmin [email protected]
    UseCanonicalName Off
    CustomLog /usr/local/apache/domlogs/domain-1.tld combined
    CustomLog /usr/local/apache/domlogs/domain-1.tld-bytes_log "%{%s}t %I .\n%{%s}t %O ."
</VirtualHost>

第二個條目。

<VirtualHost IP_ADDR:PORT>
    ServerName domain-2.tld
    ServerAlias www.domain-2.tld some-other-domain.tld another-domain.tld
    DocumentRoot /home/domain-2.tld/public_html
    ServerAdmin [email protected]
    UseCanonicalName Off
    CustomLog /usr/local/apache/domlogs/domain-2.tld combined
    CustomLog /usr/local/apache/domlogs/domain-2.tld-bytes_log "%{%s}t %I .\n%{%s}t %O ."
</VirtualHost>

bash 中產生此清單的最佳方法是什麼?

答案1

我認為你的做法是錯的。您應該使用 apache 自己的工具來執行此操作,而不是使用解析 VirtualHost 檔案(順便說一句,可以在任何地方)的 shell 腳本。其中之一是apache2ctl status

答案2

Perl 模組Config::General可以解析 Apache conf 文件,所以你可以這麼做

#!/usr/bin/perl
use strict;
use warnings;
use Config::General;

my %conf = Config::General->new('/path/to/config.conf')->getall();

for my $ip_port (keys %{$conf{VirtualHost}}) { 
    for my $vh (@{$conf{VirtualHost}{$ip_port}}) {
        if (exists $vh->{ServerName} and exists $vh->{ServerAlias}) {
            my $aliases = ref $vh->{ServerAlias} eq 'ARRAY'
                              ? join(",", @{$vh->{ServerAlias}}) 
                              : $vh->{ServerAlias};
            print $ip_port, "\t", $vh->{ServerName}, "\t", $aliases, "\n";
        }
    }
}

答案3

這段程式碼有點難看。透過組合sedawk,您可以將ServerAlias行中的域提取為多行,每行一個域

# echo '                         ServerAlias         www.domain-2.tld         some-other-domain.tld  another-domain.tld' | awk '{print substr($0, index($0, $2))}'  | sed -e 's/\s\+/\n/g'
www.domain-2.tld
some-other-domain.tld
another-domain.tld

相關內容