中編でWebDAV環境を構築したが、このままでは日本語ファイル/フォルダ名が使えないなど、多少問題がある。そこで、この問題を解決しつつ、さらにWebDAVを活用するための運用方法を模索する。
中編で構築したWebDAV環境で日本語を含む名前のファイルやフォルダを作ると、画面5のように一見正しく作成されているように見えても、
フォルダ情報を更新すると画面6のように実は名前が化けていたりすることに気が付くはずだ。この状態でアクセスすると、エラーが発生してそのファイルやフォルダは利用できない。これではいささか具合が悪い。
これは、ファイルの作成やファイル名の変更時に、WebDAVサーバに送るファイル名の文字列符号化形式がシフトJISであるのに対し(図5)、WebDAVサーバからクライアントに送られるファイル名の文字列符号化形式はUTF-8なのが直接の原因である。
クライアントからどのような符号化形式のファイル名文字列を送るかをサーバに通知するための仕組みがないうえに(XMLも関係することから、WebDAVではファイル名文字列の符号化形式についてもUTF-8を推奨していると推測される)、Webフォルダから送出されるファイル名文字列の符号化形式が常にシフトJISであることが元凶である。この部分、RFC 2718においてUTF-8が推奨されている(URIの文字符号化形式の部分)旨が記述されていることもあるが、このようなちぐはぐがないような形で取り扱ってくれればと切に希望する。
このような状況を解決するのが、IIJのTaisuke Yamada氏が作成したmod_encodingモジュール(注)である。具体的には、図6のような動作を行う。Yamada氏は本モジュールをIIJ内部で使うために作ったが、会社の許可を得て社外に公開しているとのこと。詳細な使用条件は、モジュールに記述されているので参考にしてほしい。
注:mod_encodingが使えない人は、ファイルやフォルダの作成後にフォルダ情報を更新しないで名前を変更するなどして対処してほしい。
mod_encodingの導入手順は以下のとおりである。
1.ソースコードの取得
mod_encoding.cはWebDAVのメーリングリスト(dav-dev)で公開されたものであり、これを入手するにはメーリングリストのアーカイブから取得する必要があった。しかし、今回は作者であるTaisuke Yamada氏のご厚意により、mod_encoding.cを転載させていただいた。転載を承諾いただいたTaisuke Yamada氏に感謝いたします。
なお、mod_encoding.cのオリジナルはhttp://www.lyra.org/pipermail/dav-dev/2001-May/002428.htmlにある。
2.コンパイルおよびインストール
$ apxs -c mod_encoding.c $ su root # apxs -i mod_encoding.so
これで、Apacheのモジュールが格納されているディレクトリにmod_encoding.soが作成される。
3.Apacheの設定
httpd.confファイルを編集して、
LoadModule encoding_module libexec/mod_encoding.so AddModule mod_encoding.c
という記述を追加することでmod_encodingの機能をApacheに取り込み、
<IfModule mod_encoding.c> EncodingEngine on SetServerEncoding UTF-8 AddClientEncoding SJIS "Microsoft .* DAV" AddClientEncoding SJIS "xdwin9x/" AddClientEncoding EUC-JP "cadaver/" </IfModule>
と記述することで、特定の種類のクライアント(ここではMicrosoft系OSおよびcadaver)のClient Encodingを指定し、適切な処理を行えるようにする。
4.動作確認
ここまでで、日本語ファイル/フォルダ名が扱えるようになっているはずだ。実際に日本語で名前を付けたフォルダやファイルを取り扱った例を画面7に示す。
mod_encodingは文字コードの取り扱いをiconv()の実装に依存しているため、iconv()がインストールされている必要がある。Linuxについては、最近のディストリビューションで採用しているglibcであれば問題はない(iconv()が入っている)が、そうでないものやiconv()がないOSなどでは、別途libiconvが必要となる。
なお、古いバージョンのglibcを使ったLinuxだったりすると、iconv()の実装が古くてmod_encodingモジュールが正常に機能しないことがある。このような場合は、mod_encoding.cの170行目にある、
iconv(cd, NULL, NULL, NULL, NULL);
の行を丸ごとコメントアウト/無効にすることで取りあえずの対処はできる。しかし、この部分はバッファやステータスのフラッシュを実行する部分とのことなので、glibcのバージョンアップなどで対処する方がよい。
また、iconv()の実装に起因した問題もあるが、それについては後述する。
Copyright © ITmedia, Inc. All Rights Reserved.