apacheのエラードキュメント(ErrorDocument)の設定を実際に動かしながら検証してみます。
ベース
今回はVirtualHostの設定がある状態のファイルをベースに色々と確認してみたいと思います。
設定
以下の内容をベースに色々と試していきます。
DocumentRoot "/usr/local/apache2/htdocs"
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs
ErrorDocument 404 /err.html
</VirtualHost>
また、今回は特に変更はしませんが以下の設定も入れています。
(設定を入れないと403などが発生するため)
<Directory "/usr/local/apache2/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
結果
ベースの設定の結果は以下のようになります。
$ curl http://localhost/hoge/
<!DOCTYPE html>
<html><body>
<h1>error page</h1>
<p>error page</p>
</body></html>
$
補足
この後の確認用にサブディレクトリ(test)に以下のファイルを置いています。
root@fa2efd29eba5:/usr/local/apache2/htdocs# cat test/err.html
<!DOCTYPE html>
<html><body>
<h1>sub error page</h1>
<p>sub error page</p>
</body></html>
root@fa2efd29eba5:/usr/local/apache2/htdocs#
バリエーション
ルート直下にドキュメントルートなし
設定ファイルの直下にドキュメントルート(DocumentRoot)の設定が無い場合の動きを見てみます。
設定
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs
ErrorDocument 404 /err.html
</VirtualHost>
結果
$ curl localhost/test/hoge
<!DOCTYPE html>
<html><body>
<h1>error page</h1>
<p>error page</p>
</body></html>
$
予想通りだとは思いますが、特に問題なく動きました。
VirtualHostにドキュメントルートなし
今度はVirtualHostの下にドキュメントルート(DocumentRoot)の設定が無い場合の動きを見てみます。
設定
DocumentRoot "/usr/local/apache2/htdocs"
<VirtualHost *:80>
ErrorDocument 404 /err.html
</VirtualHost>
結果
$ curl localhost/hoge
<!DOCTYPE html>
<html><body>
<h1>error page</h1>
<p>error page</p>
</body></html>
$
これも特に問題なく動きました。
ルート直下とVirtualHost下のファイルパスが異なる
設定ファイル直下とVirtualHostの下のDocumentRootのパスが異なる場合の動きを見てみます。
設定
DocumentRoot "/usr/local/apache2/htdocs"
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs/test
ErrorDocument 404 /err.html
</VirtualHost>
結果
$ curl localhost/hoge
<!DOCTYPE html>
<html><body>
<h1>sub error page</h1>
<p>sub error page</p>
</body></html>
$
サブディレクトリの方のファイルが表示されました。VirtualHostの設定の方が優先されています。
ルート直下とVirtualHost下のファイルパスが異なる(逆順)
設定ファイル直下のDocumentRootの設定がVirtualHostの後にあっても結果が同じになるか見てみます。
設定
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs/test
ErrorDocument 404 /err.html
</VirtualHost>
DocumentRoot "/usr/local/apache2/htdocs"
結果
$ curl localhost/hoge
<!DOCTYPE html>
<html><body>
<h1>sub error page</h1>
<p>sub error page</p>
</body></html>
$
VirtualHostの方の設定が有効になっています。設定の順番は結果に影響していないようです。
エラードキュメントが複数
VirtualHostの下のエラードキュメント(ErrorDocument)が複数ある場合の動きを見てみます。
設定
DocumentRoot "/usr/local/apache2/htdocs"
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs
ErrorDocument 404 /err.html
ErrorDocument 404 /test/err.html
</VirtualHost>
結果
アクセスすると以下のようになりました。
$ curl localhost/hoge
<!DOCTYPE html>
<html><body>
<h1>sub error page</h1>
<p>sub error page</p>
</body></html>
$
設定(逆バージョン)
ErrorDocumentの順序を逆にしてみます。
DocumentRoot "/usr/local/apache2/htdocs"
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs
ErrorDocument 404 /test/err.html
ErrorDocument 404 /err.html
</VirtualHost>
結果(逆バージョン)
以下のような結果になりました。
$ curl localhost/hoge
<!DOCTYPE html>
<html><body>
<h1>error page</h1>
<p>error page</p>
</body></html>
$
まとめ
ErrorDocument設定は後勝ちになっているようです。前回、設定ファイル直下でも確認しましたが、VirtualHostの下でも動きは同じようです。
ドキュメントルートが複数
VirtualHostの下にドキュメントルート(DocumentRoot)が複数ある場合の動きを見てみます。
設定
DocumentRoot "/usr/local/apache2/htdocs"
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs
DocumentRoot /usr/local/apache2/htdocs/test
ErrorDocument 404 /err.html
</VirtualHost>
結果
以下のような結果になりました。
$ curl localhost/hoge
<!DOCTYPE html>
<html><body>
<h1>sub error page</h1>
<p>sub error page</p>
</body></html>
$
サブディレクトリの方のファイルが表示されています。
設定(逆バージョン)
DocumentRoot "/usr/local/apache2/htdocs"
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs/test
DocumentRoot /usr/local/apache2/htdocs
ErrorDocument 404 /err.html
</VirtualHost>
結果(逆バージョン)
今度は以下のようになりました。
$ curl localhost/hoge
<!DOCTYPE html>
<html><body>
<h1>error page</h1>
<p>error page</p>
</body></html>
$
まとめ
設定ファイル直下で確認した時と同様に、VirtualHostの下でもエラードキュメント(DocumentRoot)の設定は後勝ちになるようです。
その他
今回はVirtualHostを使った設定をベースに色々と試しました。前回はファイル直下に設定されている状態をベースに色々と試しています。その内容は以下に記載しています。
コメント