apacheの設定ファイルで、VirtualHostやDirectoryなどを組み合わせた際のErrorDocumentの優先度について見ていきます。
ここではメッセージ形式でエラードキュメントを指定した場合について記載します。URL(ローカルパス)形式での話は別の記事で整理します。
基本
まず、組み合わせを試してみるパターンについて記載します。
root > ErrorDocument (a)
設定ファイルの直下にErrorDocumentの記載があるパターンです。
ErrorDocument 404 "404 [a : root > ErrorDocument]"
root > VirtualHost > ErrorDocument (b)
VirtualHostの下にErrorDocumentの記載があるパターンです。
<VirtualHost *:80>
ErrorDocument 404 "404 [b : root > VirtualHost > ErrorDocument]"
</VirtualHost>
root > Directory > ErrorDocument (c)
Directoryの下にErrorDocumentの記載があるパターンです。
<Directory "/usr/local/apache2/htdocs/">
ErrorDocument 404 "404 [c : root > Directory > ErrorDocument]"
</Directory>
root > VirtualHost > Directory > ErrorDocument (d)
VirtualHostの下にDirectoryがあり、さらにその下にErrorDocumentの記載があるパターンです。
<VirtualHost *:80>
<Directory "/usr/local/apache2/htdocs/">
ErrorDocument 404 "404 [d : root > VirtualHost > Directory > ErrorDocument]"
</Directory>
</VirtualHost>
root > Directory > VirtualHost > ErrorDocument (e)
Directoryの下にVirtualHostがあり、さらにその下にErrorDocumentの記載があるパターンです。これは以下のように構文エラー(Syntax error)になり、起動ができませんでした。
AH00526: Syntax error on line 10 of /usr/local/apache2/conf/httpd.conf:
<VirtualHost not allowed in <Directory> context
優先度の確認
(a)と(b)
「a(root直下)」と「b(VirtualHostの下)」の組み合わせです。以下のような感じです。
ErrorDocument 404 "404 [a : root > ErrorDocument]"
<VirtualHost *:80>
ErrorDocument 404 "404 [b : root > VirtualHost > ErrorDocument]"
</VirtualHost>
これはbが優先されました。
$ curl 0.0.0.0:8081/hoge
404 [b : root > VirtualHost > ErrorDocument]
これはaとbの順序(設定ファイルでの記載順)を変えても結果は同じになります。直下に記載するよりVirtualHostの下に記載した方が優先されるようです。
(a)と(c)
「a(root直下)」と「c(Directoryの下)」の組み合わせです。
ErrorDocument 404 "404 [a : root > ErrorDocument]"
<Directory "/usr/local/apache2/htdocs/">
ErrorDocument 404 "404 [c : root > Directory > ErrorDocument]"
</Directory>
これはcが優先されました。
$ curl 0.0.0.0:8082/hoge
404 [c : root > Directory > ErrorDocument]
これも先ほどと同様、並び順に寄らず同じ結果になります。直下に記載するよりDirectoryの下に記載した方が優先されるようです。
(a)と(d)
「a(root直下)」と「d(VirtualHostのDirectoryの下)」の組み合わせです。
ErrorDocument 404 "404 [a : root > ErrorDocument]"
<VirtualHost *:80>
<Directory "/usr/local/apache2/htdocs/">
ErrorDocument 404 "404 [d : root > VirtualHost > Directory > ErrorDocument]"
</Directory>
</VirtualHost>
これはdが優先されました。これも並び順に寄らず同じ結果です。
$ curl 0.0.0.0:8083/hoge
404 [d : root > VirtualHost > Directory > ErrorDocument]
ここまでaとb、c、dの組み合わせを試しましたが、基本的に直下に書くより何かしらのディレクティブの下に書いたエラードキュメントの方が優先されることが分かりました。
(b)と(c)
「b(VirtualHostの下)」と「c(Directoryの下)」の組み合わせです。
<VirtualHost *:80>
ErrorDocument 404 "404 [b : root > VirtualHost > ErrorDocument]"
</VirtualHost>
<Directory "/usr/local/apache2/htdocs/">
ErrorDocument 404 "404 [c : root > Directory > ErrorDocument]"
</Directory>
これはcが優先されました(並び順に寄らず同じ)。
$ curl 0.0.0.0:8085/hoge
404 [c : root > Directory > ErrorDocument]
VirtualHostとDirectoryではDirectoryの方が優先されるみたいです。
(b)と(d)
「b(VirtualHostの下)」と「d(VirtualHostのDirectoryの下)」の組み合わせです。
(b)が先
(b)を先に記載した場合です。
<VirtualHost *:80>
ErrorDocument 404 "404 [b : root > VirtualHost > ErrorDocument]"
</VirtualHost>
<VirtualHost *:80>
<Directory "/usr/local/apache2/htdocs/">
ErrorDocument 404 "404 [d : root > VirtualHost > Directory > ErrorDocument]"
</Directory>
</VirtualHost>
以下のように(b)が優先されました。
$ curl 0.0.0.0:8086/hoge
404 [b : root > VirtualHost > ErrorDocument]
(d)が先
(d)を先に記載した場合です。
<VirtualHost *:80>
<Directory "/usr/local/apache2/htdocs/">
ErrorDocument 404 "404 [d : root > VirtualHost > Directory > ErrorDocument]"
</Directory>
</VirtualHost>
<VirtualHost *:80>
ErrorDocument 404 "404 [b : root > VirtualHost > ErrorDocument]"
</VirtualHost>
以下のように(d)が優先されました。
$ curl 0.0.0.0:8095/hoge
404 [d : root > VirtualHost > Directory > ErrorDocument]
解説
「b」と「d」の組み合わせは、並び順によって結果が変わりました。先に記載した方が優先されています。これは単純にVirtualHostが複数ある場合に先に記載した方がデフォルトになるためだと思われます。
(c)と(d)
「c(Directoryの下)」と「d(VirtualHostのDirectoryの下)」の組み合わせです。
<Directory "/usr/local/apache2/htdocs/">
ErrorDocument 404 "404 [c : root > Directory > ErrorDocument]"
</Directory>
<VirtualHost *:80>
<Directory "/usr/local/apache2/htdocs/">
ErrorDocument 404 "404 [d : root > VirtualHost > Directory > ErrorDocument]"
</Directory>
</VirtualHost>
これはdが優先されました(並び順に寄らず同じ)。
$ curl 0.0.0.0:8093/hoge
404 [d : root > VirtualHost > Directory > ErrorDocument]
並び順に寄らず、より深い階層のものが優先されるようです。
今回の作成物
今回の作成物は以下に置いています。自分でも試してみたい方は使ってみてください。
https://github.com/masaki-code/docker/tree/master/apache/priority
コメント