VirtualHost内で
ScriptAlias / /hoge/hoge
のようにしてスクリプトを実行しているのですが、
ErrorDocument 404 /notfound.html
とすると,404のときにexample.com/notfound.htmlにリダイレクトされてしまいます。
ErrorDocumentはスクリプトから配信するのではなくapacheのDocumentRootの/var/www/html/以下を開くようにしたいです。
ScriptAliasでDocumentRootが/になっているのが原因だと思うのですが、
この場合、ErrorDocumentはどのように記述すべきでしょうか?
ErrorDocumentはすべてまとめてerrorディレクトリに入れてはいかがでしょうか?
リダイレクトされずに(ブラウザのURL欄が変わらず)、エラーページとして指定した内容のページが表示されます。
設定は以下のようにします。
ErrorDocument 404 /error/notfound.html
ErrorDocumentのHTMLファイルは「/var/www/html/error」内に入れます。
あるいは別の方法として、「ScriptAlias」ではなく「ScriptAliasMatch」を使用しても大丈夫です。
この場合の設定は以下のようにします。
ScriptAliasMatch ^/(.*\.cgi) "/hoge/hoge/$1"
http://httpd.apache.org/docs/2.1/ja/mod/mod_alias.html#scriptaliasmatch
どちらでも好きな方法を試してみてください。
ScriptAlias / の前に
Alias /notfound.html /var/www/html/notfound.html
もしくは
AliasMatch ^/(.*).html /var/www/html/$1.html
を設定しておく方法もありかなと思います。
「AliasMatch」を使う場合は、以下のように直接対象のエラーページの名前を指定しないと、普通のHTMLページがループになってしまう可能性がありますね・・・
AliasMatch ^/(notfound|forbidden|servererror).html /var/www/html/$1.html
なるべく私が回答No.1で回答したどちらかの方法を使用するのがいいと思います。
すみません。上記コメントは間違いでした。
エイリアスの場合、ループにはならないんですね。
むしろ上記コメントの記述にした場合、エラーページ以外のHTMLが表示されなくなりました・・・
大変失礼しました。
※「Alias」による直接指定も同様の状態になりますので、Aliasによる指定は使用しない方が良さそうです。
なお、「AliasMatch」ですが、回答の記述では「http://example.jp/」や「http://example.jp/category/」等、ディレクトリへのアクセスの場合にページが表示されませんので、以下のようにする必要がありました。
AliasMatch ^/(|.*/|.*\.html)$ /var/www/html/$1
おそらく画像やCSS等もあると思いますので、その場合は以下のようにする必要があります。
AliasMatch ^/(|.*/|.*\.html|.*\.css|.*\.js|.*\.gif|.*\.png|.*\.jpg)$ /var/www/html/$1
スクリプトエイリアスを適用したくない種類のファイルが他にもある場合、上記にさらに追加しなければなりませんので、「ScriptAliasMatch」でCGIファイル等を指定する方が良いように思います。
※すみません。
「Alias」と「AliasMatch」に関する事ですので、こちらの回答にコメントしました。
(脱字を訂正してサイドコメントしています。)
「ScriptAliasMatch」を使う場合で、拡張子がcgi以外のファイルも対象の場合は、以下のようにファイル名と拡張子を分けて指定してみてください。
2011/11/29 21:27:11