apacheのErrorDocumentの動きについて(ローカルパス)(VirtualHost)

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を使った設定をベースに色々と試しました。前回はファイル直下に設定されている状態をベースに色々と試しています。その内容は以下に記載しています。

コメント

タイトルとURLをコピーしました