アクセスしたURLごとに異なるエラーページの設定方法(apache)

apacheのErrorDocumentの設定でエラーページを設定することができます。ここではURLごとに異なるエラーページを設定する方法について実際に設定を行いながら試していきます。

今回の構成

まず、今回試す環境の構成について説明します。

apacheの設定内容(httpd.conf)

apacheの設定ファイル(httpd.conf)にて、以下のような設定をしています。

<Directory "/usr/local/apache2/htdocs/">
    ErrorDocument 404 /404.html
</Directory>

<Directory "/usr/local/apache2/htdocs/web1/">
    ErrorDocument 404 /web1/404.html
</Directory>

<Directory "/usr/local/apache2/htdocs/web2/">
    ErrorDocument 404 /web2/404.html
</Directory>

詳細

設定ファイル(httpd.conf)の内容について説明します。まず、

<Directory "パス">

でディレクトリを指定しています。そして

ErrorDocument 404 /404.html

の部分ですが、ここは順に「ErrorDocument」(固定の文言)、HTTPステータス、表示させるエラーページを記載します。今回は404(Not Found)だけ設定しています。

注意点

ここで表示させるエラーページについて、1点注意があります。それはドキュメントルート(DocumentRoot)からの相対パスを指定するという点です。

「Directory」ディレクティブで指定しているパスからの相対パスではないので、注意してください。今試している環境ではデフォルトで以下の設定が入っているため、「/usr/local/apache2/htdocs」からの相対パスを指定することになります。

DocumentRoot "/usr/local/apache2/htdocs"

エラーページのHTMLファイル(404.html)

エラーページ用のHTMLファイルをそれぞれのサブディレクトリごとに用意しています。動作確認をする際に区別がつくように以下のような形で作成しています。

ルートディレクトリ(/usr/local/apache2/htdocs)用

<!DOCTYPE html>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
<p>root page</p>
</body>
</html>

サブディレクトリ(/usr/local/apache2/htdocs/web1)用

<!DOCTYPE html>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
<p>web1 page</p>
</body>
</html>

サブディレクトリ(/usr/local/apache2/htdocs/web2)用

<!DOCTYPE html>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
<p>web2 page</p>
</body>
</html>

動作確認

今回の構成で実際にエラーページがどのように表示されるか見てみます。

ルートページ(/)

今回用意しているエラーページは404のページなので、適当なパスを指定してアクセスしてみます。

ルートディレクトリ用のHTMLファイルが表示されました。

サブページ(/web1)

次に「/web1」配下のページで同様に適当なパスを指定してみます。

今度はサブディレクトリ(web1)用のHTMLファイルが表示されました。

サブページ(/web2)

さらに「/web2」配下でも試してみます。

サブディレクトリ(web2)用のHTMLファイルが表示されました。

発展(VirtualHost設定との組み合わせ)

さらに発展させてVirtualHostの設定と組み合わせてみます。

apacheの設定内容(httpd.conf)

今度のapacheの設定ファイルは以下の内容を記載しています。

<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/htdocs/web1/
    ServerName web1.masaki-blog.net

    <Directory "/usr/local/apache2/htdocs/web1/">
        ErrorDocument 404 /404.html
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/htdocs/web2/
    ServerName web2.masaki-blog.net

    <Directory "/usr/local/apache2/htdocs/web2/">
        ErrorDocument 404 /404.html
    </Directory>
</VirtualHost>

VirtualHostディレクティブの中にDirectoryディレクティブを記載し、その中でエラードキュメントの設定をしています。

先ほど説明した通り、エラーページのパスはドキュメントルート(DocumentRoot)からの相対パスになるので、先ほどとはパスの指定が変わっている点に注意してください。

(先ほどは「/web1/404.html」でしたが、今回は「/404.html」になっています。)

動作確認

新しい設定でエラーページがどのように表示されるか見てみます。

ドメイン指定なしのアクセス

まず、ドメインの指定がない場合は以下のように表示されます。

web1ドメインへのアクセス

次にweb1のドメインでアクセスした結果が以下です。

サブディレクトリ(web1)用のHTMLファイルが表示されました。

web2ドメインへのアクセス

web2のドメインでも確認してみます。

今度はサブディレクトリ(web2)用のHTMLファイルが表示されました。

発展の内容まとめ

このようにVirtualHostとErrorDocumentを組み合わせることで、ウェブサイト(ドメイン)ごとに異なるエラーページを設定することができます。複数ドメインを1サーバで管理し、エラーページをドメインごとに分けたい場合に活用できます。

今回の作成物

今回の作成物は以下に置いています。自分でも試してみたい方は使ってみてください。

https://github.com/masaki-code/docker/tree/master/apache/errordocument

Docker環境がある方は、Dockerfileも用意しているので直ぐに試せると思います。

コメント

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