Lighttpd でエラーコード別に表示する html を変更する方法
Apache から Lighttpd に変更する際に、httpd.conf に相当する lighttpd.conf 向けにいろいろ設定を移行(変更)する必要がありますが、ずーっと気になっていたことがありました。
Apache ではエラー画面をかっこうよく見せるために、ErrorDocument ディレクティブなるものが存在します。具体的にはこんな風に書きます。
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だと今日初めて知りました。
server.errorfile-prefix = "/home/lighttpd/htdocs/error-"
と設定した場合、それぞれのエラーコードにしたがって、自動的に error-403.html / error-500.html と言った具合にマッピングしてくれます。Apache の場合と違うのは、static な html にのみマッピング可能なので、CGI へマッピングすることはできません。
ちなみに、マッピングしている部分は、connections.c ファイルの connection_handle_write_prepare 関数内の
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 なエラー画面をコードで振り分けることができただけでも良しとします。。
ちなみに、最近気がついたのですが、
url.rewrite = (
"^(.*)/MyApp/(.*)$" => "$1/MyApp.fcgi?$2",
)
って設定してると、正常に Rewrite されているにもかかわらず。
なんてエラーがでているようです。server.errorfile-prefix ディレクティブであればエラーはでないようなので、原因追及の深追いしていませんが、server.errorfile-prefix ディレクティブは使わない方が良さそうです。
コメントやシェアをお願いします!