cifsマウントしたWindowsファイルサーバを,Apacheのmod_autoindexで公開する
mod_autoindexで遊ぶ(日付書式の改造など)このページの内容は,WebDAVでWindowsファイルサーバをマウント公開すると重なる箇所がありますので, そちらも良ければ参照してください. そちらは,mod_autoindexではなくWebDAV(mod_dav+mod_encoding)で公開する場合の話になります.
概要自宅のファイルサーバ(Windows2000)を,インターネットから参照できるようにしたいというのが,今回の目的. それを簡単に実現するために,Apache標準付属のmod_autoindexを使うことにした. mod_autoindexは,公開対象のディレクトリに対してApacheの設定で Options Indexes を指定するだけで使えるのだが,しかし細かい点で不満があったのでそれを何とかしようというのが, このページの内容です.
mount -t cifs //fsever/home /mnt/fs -o username=test,password=xxxxx,iocharset=utf8
1.Last modifiedの日付書式への不満問題点更新日時(Last modified)の書式が,以下のようにアメリカ式で表示されるのだが,01-Sep-2007 22:03 これがどうもいまいちだ.日本人にも読みやすい書式に変えたい.例えば以下のような感じ. 2007/09/01 22:03 mod_autoindexのソースを調べたところ,以下のように書式が直書きされていた. httpd-2.2.6/modules/generators/mod_autoindex.c の L.1722,L.1810 apr_strftime(time_str, &rv, MAX_STRING_LEN, "%d-%b-%Y %H:%M ", &ts);
対応策この書式指定の箇所を,以下のように修正すればよい.[変更前] "%d-%b-%Y %H:%M " [変更後] "%Y/%m/%d %H:%M " 修正内容をパッチファイルとして作成してみた. mod_autoindex.c-2.2.6_patch 1722c1722 < "</td><td align=\"right\">%d-%b-%Y %H:%M ", --- > "</td><td align=\"right\">%Y/%m/%d %H:%M ", 1810c1810 < "%d-%b-%Y %H:%M ", &ts); --- > "%Y/%m/%d %H:%M ", &ts); 1814,1815c1814,1815 < /*Length="22-Feb-1998 23:42 " (see 4 lines above) */ < ap_rputs(" ", r); --- > /*Length="1998/02/22 23:42 " (see 4 lines above) */ > ap_rputs(" ", r); ![]() このパッチを使えば,以下のような手順でパッチ適用,コンパイルを行える. cd httpd-2.2.6/modules/generators patch mod_autoindex.c mod_autoindex.c-2.2.6_patch cd ../.. make 以下のような表示になる.Last modifiedに注目.
2.文字コードについて問題点mod_autoindexで日本語のディレクトリ名,ファイル名を表示すると, ファイルシステム上の文字コードのままでURLエンコーディングされたものが, 表示されるファイル名,リンク先URLに使われる.これはこれでいいんですが,表示時にその文字コードがどのエンコーディングなのかを判断するための情報が無いため, ブラウザの文字コード自動判別に委ねられており,よく文字化けが発生する. そのような時は,ブラウザ上でエンコーディングの設定を変えれば良いのだが,手間だ. そこで文字化けが起こらないように,ブラウザに対してエンコーディングを判別するための情報をちゃんと渡してやることを考える.
A.IndexOptionsのCharsetオプションによる対応Apache2.2.6付属のmod_autoindexからは,IndexOptionsにCharsetを指定できるようになった. そのため,ファイル名に使われているエンコーディングを,Charsetで指定すればよい. 今回はUTF-8を使っているので,IndexOptionsの指定で以下を行う. IndexOptions Charset=UTF-8 これを指定すると,レスポンスのHTTPヘッダに以下のような内容が付くようになる. Content-Type: text/html;charset=UTF-8 ブラウザはこれを見てUTF-8だと判断するので,他のエンコーディングに誤判別して文字化けするようなことは無くなる.
B.Charsetオプションが使えない場合 (古いApache)それよりApacheのバージョンが古い場合は,以下の代替案が考えられる. HTTPヘッダを制御できないので,HTMLのhead部分のmetaタグでcharsetを明示することを考える. mod_autoindexが生成するHTMLのhead部分は,HeaderNameで指定したファイルで差し替えることができるので, head部分に使用するファイルとして,以下を作成し, DOCUMENT_ROOT/autoindex_head.txt <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Index</title> </head> <body> HeaderName /autoindex_head.txt IndexOptions SuppressHTMLPreamble
この代替案の欠点としては,<title>にディレクトリ名を含められないということがある. mod_autoindex標準の<title>では,ディレクトリ名が使われて <title>Index of /path1/path2</title>
3.まとめうちでは,上記の日付書式の改造を行った上で,以下のような設定で使っています. Alias /fsmnt /mnt/fs/ <Directory /mnt/fs/> EnableSendfile Off DirectoryIndex .not.exist.file Options Indexes IndexOptions FancyIndexing IgnoreCase NameWidth=* SuppressDescription HTMLTable Charset=UTF-8 RemoveHandler .cgi </Directory>
|