Lighttpd でエラーコード別に表示する html を変更する方法

Apache から Lighttpd に変更する際に、httpd.conf に相当する lighttpd.conf 向けにいろいろ設定を移行(変更)する必要がありますが、ずーっと気になっていたことがありました。

Apache ではエラー画面をかっこうよく見せるために、ErrorDocument ディレクティブなるものが存在します。具体的にはこんな風に書きます。

ErrorDocument 500 http://foo.example.com/cgi-bin/tester
ErrorDocument 404 /cgi-bin/bad_urls.pl
ErrorDocument 401 /subscription_info.html
ErrorDocument 403 "Sorry can't allow you access today"

Lighttpd には server.error-handler-404 ディレクティブが存在してますが、404 エラーに対してのみ有効です。

- スポンサーリンク -

その他のエラーに対しても同じようにエラー画面をカスタマイズしたい場合は、server.errorfile-prefix ディレクティブを設定すればOKだと今日初めて知りました。

## Format: .html
server.errorfile-prefix = "/home/lighttpd/htdocs/error-"

と設定した場合、それぞれのエラーコードにしたがって、自動的に error-403.html / error-500.html と言った具合にマッピングしてくれます。Apache の場合と違うのは、static な html にのみマッピング可能なので、CGI へマッピングすることはできません。

ちなみに、マッピングしている部分は、connections.c ファイルの connection_handle_write_prepare 関数内の

/* try to send static errorfile */
if (!buffer_is_empty(con->conf.errorfile_prefix)) {
 stat_cache_entry *sce = NULL;
 
 buffer_copy_string_buffer(con->physical.path, con->conf.errorfile_prefix);
 buffer_append_string(con->physical.path, get_http_status_body_name(con->http_status));
 
 if (HANDLER_ERROR != stat_cache_get_entry(srv, con, con->physical.path, &sce)) {
  con->file_finished = 1;
  
  http_chunk_append_file(srv, con, con->physical.path, 0, sce->st.st_size);
  response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_BUF_LEN(sce->content_type));
 }
}

という部分。CGI へリダイレクトとかできるようになれば便利になるのになぁ〜と思う次第ですが、Hack するにはちょっと敷居が高すぎるので、取りあえずは Static なエラー画面をコードで振り分けることができただけでも良しとします。。

ちなみに、最近気がついたのですが、

server.errorfile-prefix = "/home/lighttpd/htdocs/"
url.rewrite = (
 "^(.*)/MyApp/(.*)$" => "$1/MyApp.fcgi?$2",
)

って設定してると、正常に Rewrite されているにもかかわらず。
2006-02-19 12:01:49: (connections.c.1330) error-handler not found: /404.html

なんてエラーがでているようです。server.errorfile-prefix ディレクティブであればエラーはでないようなので、原因追及の深追いしていませんが、server.errorfile-prefix ディレクティブは使わない方が良さそうです。
- スポンサーリンク -

関連する記事&スポンサーリンク