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

を指定するだけで使えるのだが,しかし細かい点で不満があったのでそれを何とかしようというのが, このページの内容です.

  • Apache 2.2.6
  • Windowsファイルサーバは,以下のようにiocharset=utf8でcifsマウントしている
 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);
このapr_strftime()関数は,内部的にC標準ライブラリのstrftime()を呼び出しているため, strftime()と同じ書式が使える模様.

対応策

この書式指定の箇所を,以下のように修正すればよい.
[変更前]
"%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);
filemod_autoindex.c-2.2.6_patch

このパッチを使えば,以下のような手順でパッチ適用,コンパイルを行える.

cd httpd-2.2.6/modules/generators
patch mod_autoindex.c mod_autoindex.c-2.2.6_patch
cd ../..
make

以下のような表示になる.Last modifiedに注目.

fancy1.png

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>
そしてhttpd.confでは,対象ディレクトリの<Location>か<Directory>で,
HeaderName /autoindex_head.txt
IndexOptions SuppressHTMLPreamble
を指定すれば良い.

HeaderName /autoindex_head.txt
先頭にインクルードするテキストファイル名
IndexOptions SuppressHTMLPreamble
これを入れないと,ヘッダ部が二重に出力されてしまう.mod_autoindexが生成するものと,HeaderNameのファイル内容が両方出力されてしまうということ.

この代替案の欠点としては,<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>

EnableSendfile Off
うちでは,Windowsファイルサーバをcifsでマウントしているのでこれが必要
DirectoryIndex .not.exist.file
リクエストでファイル名を省略したときに,常にディレクトリ一覧を表示させたいという意図.DirectoryIndexを無効にできればベストだが,その方法が判らないのでこうしている.「.not.exist.file」とは存在しないであろうダミーファイル名
Options Indexes
ディレクトリ一覧を表示させるために当然必要
IndexOptions FancyIndexing IgnoreCase NameWidth=* SuppressDescription HTMLTable
ディレクトリ一覧の表示形式指定.お好みで
IndexOptions Charset=UTF-8
Windowsファイルサーバをcifsマウントするときにiocharsetに指定した値
RemoveHandler .cgi
CGIプログラムをダウンロード可能にするため.これが無いとうちの環境ではCGIプログラムをクリックすると実行しようとしてしまい,ダウンロードができない
kamolandをフォローしましょう


© 2017 KMIソフトウェア