質問: CentOS 6.9 上の apache2.2.15 で複数のネームベースバーチャルホストを構築しています。 バーチャルホストの設定ファイルを、ホスト名ごとに `/etc/httpd/conf.d/` に `(hostname).conf` というファイル名で置いています。`httpd.conf` に ``` # # Load config files from the config directory "/etc/httpd/conf.d". # Include conf.d/*.conf ``` とありますため、conf.d/以下の設定ファイルをアルファベット順で読み込んでくれるようです。Include ディレクティブ このアルファベット順というのはアスキーコード順と考えていいのでしょうか。 といいますのは、デフォルトのバーチャルホスト設定を `_default.conf` として用意しておりまして、これを必ず最初に読み込んで欲しいのです。(アスキーコードなら `_` はどの英文字よりも前なので)
回答: そうですね、 ASCII コード順と考えて良いと思います。 1. `Include` ディレクティブの処理は、 `core.c` のこの部分 にある通り、 `include_config` 関数によって行われています。 2. 同じファイルのこの部分 にある通り、 `include_config` 関数の実処理は `ap_process_resource_config` 関数に移譲されています。 3. `ap_process_resource_config` 関数は `config.c` のここ で定義されていますが、読み進めていくと、 glob 文字を含むパターンの場合はディレクトリの中の一致する ファイル名の一覧を取得後、 `fname_alphasort` 比較関数を用いて `qsort` でクイックソートをした順で読み込んで います。 4. `fname_alphasort` 関数の実態は 同じファイルのここ にあり、単純に `strcmp` 関数によるファイル名の比較を行っています。 5. `strcmp` 関数は 2 つの文字列をバイト単位で比較し、最初に一致しなかったバイトの unsigned char 単位での差異を返します から、つまりこれは ASCII コード文字が含まれていればそのコード順です。 2.4 だと `httpd -t -D DUMP_CONFIG | grep "In file"` 等として実際に読み込まれた順序を確認できるはずなのですが、 2.2 だと上記の通り、実装を確認する以外に方法が無いような気がします。