Apacheの小言

今のApacheである事をしたときに不満があるのでいくつか。




Apacheで、confなり.htaccessなりで、
Option Indexes
IndexOptions FancyIndexing
ってやると、ディレクトリにアクセスするとファイルの一覧が表示される。
このときに不満がある。

Parent Directory

まず、Parent Directoryってリンク。
これは一つ上の階層に移動するという、あると格段に便利なリンクで、当然あったほうがいいわけです。
でも、userdirモジュールを使ったときに少し不満が。
userdirモジュールを使うと、設定にもよりますが、一般的には、
ttp://xxx.com/~yyy/って表記ができて、
ユーザーyyyのpublic_htmlディレクトリにアクセスできるようになるわけですが、
Indexesを有効にしていたときに、それが出ます。
まず、
ttp://xxx.com/~yyy/zzz/
ここを参照していたとき、Parent Directoryを押すと、上の階層に飛ぶので当然、
ttp://xxx.com/~yyy/
ここに飛ぶ。ユーザーyyyからすればここが最上位のディレクトリ。
でもParent Directory出てくる。押せば当然、
ttp://xxx.com/
ここに飛ぶ。ここまでくると、もはやユーザーyyyは関係ないよね、って話。
もちろんここまでくればParent Directoryは出ない。
ttp://xxx.com/~yyy/
このときにもう上の階層に辿れなくするにはどうすればいいんだろう。
ちょっと探したけど、解決策が見つからなかったので、あきらめた。

@追記

mod_autoindexの動作に注目すると、
上へのパスには"../"ではなく"/...."で参照している。
ttp://xxx.com/~yyy/zzz/ の時、Parent Directoryのリンク先は"/~yyy/"
ttp://xxx.com/~yyy/ の時、Parent Directoryのリンク先は"/"となっている。
そしてユーザーディレクトリは必ず"/~"で始まると決めれば、

mod_autoindex.c
        if (!x && t[0] == '/') {
+            if(t[1] == '\0' && strncmp(name, "/~", 2)==0) continue; /* userdir's document root */
            t2 = "Parent Directory";
        }
        else {
            t2 = t;
        }

こんな感じ1行追加してみると、気に入った動作になった。
x==0でかつ"/"で始まっていれば、親ディレクトリへのパスということで、
表示する文字列はファイル名でなくParentDirectoryに書き換えている、という感じだった。
そこにさらに、ドキュメントルートへのパスでありかつ、name(r->uri)が"/~"で始まっているのなら、
それはuserdirから見てドキュメントルートなので無視して次へ、とやっているだけ。シンプル。
ちなみにnameには、ttp://xxx.com/~yyy/ならば、ドメイン以降の文字列"/~yyy/"が入っています。


欠点はドキュメントルートに/~zzz/というディレクトリを作ると、
ユーザーディレクトリでもないのに、親ディレクトリを辿れなくなる事。
ドキュメントルートを使うのはとりあえず自分だけなので問題ないが、
これも考慮するとなると、かなりいじらないと行けなくなりそう。

Last modified

次に、最終更新日を示す「Last modified」って項目があるのだけど、
これの日付フォーマットがどうも気に食わない。
海外的にはそれが一般的なんだけど、僕の中では、
YYYY-MM-DD HH:MM
って感じがいいな!って思うわけです。
フォーマットの指定ぐらいは設定でできるだろうと思ったけど、ないんですよね。
需要の少ない事だから静的な文字列で書いてるじゃないかな、と思ったが、
日本語環境では「DD-MM月-YYYY HH:MM」って日本語を含めて表示されるので、
やはりロケールによって表示を分けてるはず、ということで、ソースコードを眺めてみた。
mod_autoindex.cにて、apr_strftime関数を呼び出してフォーマットを指定していた。

mod_autoindex.c
apr_strftime(time_str, &rv, MAX_STRING_LEN,
                                "%d-%b-%Y %H:%M  ", &ts);

timestr.cにてapr_strftime関数のコードが書かれていて、中身はただstrftime関数のラッパー関数でした。
以下でstrftime関数の仕様を読める。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strftime.3.html
mod_autoindex.cの"%d-%b-%Y %H:%M"を"%Y-%m-%d %H:%M"に書き換えて(2箇所)、
コンパイルしなおして、出来上がったmod_autoindex.soだけを置き換えて、apacheを再起動して完了。
「02- 1月-2010 01:23」という表記から「2010-01-02 01:23」になり、満足。