これはApache httpd 2.4です。
以前のインストールを2.2から2.4に移植しようとし、その過程で少しクリーンアップします。同じ設定を持つ多くのディレクトリがあり、その間にいくつかの異なるディレクトリが散在しています。基本的には次のようになります。
<directory /var/www/aaa >
# lots of stuff
</directory>
<directory /var/www/bbb >
# lots of stuff
</directory>
<directory /var/www/ >
# lots of stuff
</directory>
<directory /var/www/ccc >
# lots of other stuff
</directory>
追加の行を避けたいので、次のような一種の速記を使いたいです。
<directory /var/www/aaa >
<directory /var/www/bbb >
<directory /var/www/ >
# lots of stuff
</directory>
<directory /var/www/ccc >
# lots of other stuff
</directory>
しかし、<Directory>
私が見つけることができるどんな方法でも複数のディレクトリをサポートしていません。したがって、<DirectoryMatch>
次のように適切に見えます。
<directoryMatch /var/www/(aaa|bbb|) >
# lots of stuff
</directory>
<directoryMatch /var/www/ccc >
# lots of other stuff
</directory>
/var/www/(aaa|bbb|)
一致が不完全なため失敗します/var/www/ccc
。対照的に<Directory>
、<DirectoryMatch>
ディレクトリコンポーネントは、最も短いものから最も長いものの順に処理されません。マニュアルでは、「各グループ内のセクションは構成ファイルに表示される順序で処理されます」と主張していますが、セクションを切り替えても結果はまだ同じです(「代わりに」/var/www/ccc
と表示されます)。 。# lots of stuff
# lots of other stuff
この例ではもちろんregexp(/var/www/(aaa|bbb|(?!ccc))
)を拡張できますが、残念ながら実際の設定はそれよりはるかに複雑です。正規表現を使用することはまだ可能ですが、結果を理解または維持するのは困難です。
もしそうなら、DirectoryMatchに加えてこれを行う他の方法はありますか?誰でも私にヒントを与えることができますか? Apacheが上記の部分一致を好む理由を説明してください。ありがとうございます。
ベストアンサー1
、、、およびDirectoryMatch
すべて一致するが一致しない読みやすい方法はありません。これは、他の3つのディレクトリがすべて含まれているためです。/var/www/aaa
/var/www/bbb
/var/www
/var/www/ccc
/var/www
おそらく使用する方が簡単です。モードマクロ構成の共通部分を定義し、元の例Directory
のように適用します。
a2enmod macro # Enable the mod_macro module
systemctl restart apache2 # YMMV but this is the systemd way
その後、マクロを定義できます。これが私が使うものです
# Logging
#
<Macro CronoLogger $vHost>
ServerSignature On
LogLevel warn
ErrorLog "|/usr/bin/cronolog /home/www/$vHost/logs/%Y/%m/%d/public-error.log"
CustomLog "|/usr/bin/cronolog /home/www/$vHost/logs/%Y/%m/%d/public-access.log" combined
</Macro>
次のようにvHost定義に含めます。
Use CronoLogger www.contoso.com
あなたの場合、サンプルマクロを使用すると、StandardStuff param1 param2
次のように使用できます
<Directory /var/www>
Use StandardStuff /var/www /
</Directory>
<Directory /var/www/aaa>
Use StandardStuff /var/www /aaa
</Directory>
<Directory /var/www/bbb>
Use StandardStuff /var/www /bbb
</Directory>
<Directory /var/www/ccc>
# Do non-standard stuff here
#
</Directory>