Apache2 ファイル名/ディレクトリ名エンコード変換パッチ 2002/12/01 吉山あきら ■はじめに 初期の WWW の仕様には URL のエンコードに関する規定がありませんでした。 しかし、Web コンテンツのファイル名を ASCII にするのが暗黙の了解でした ので、さほど大きな問題は起こりませんでした。Apache も登場以来ずっと、 ファイルシステム上のファイル/ディレクトリ名のエンコードや、URL 中のパ スのエンコードに関する配慮は一切なされていません。 しかし、ホームページを作成するユーザ層の拡大に伴い、パス名に各国語の エンコードを使用するユーザが登場しました。更に、Internet Explorer や MS Office に WebDAV クライアント機能が搭載されると、特に URL 側のパス 名のエンコード問題が深刻化しました。 Apache において、この URL 側の問題を解決するのが IIJ 山田氏作の mod_encoding パッチです。このパッチは Web や WebDAV のクライアントを判 別し、URL を指定したエンコードへ変換する機能を提供します。しかし、この パッチはファイルシステム上のファイル/ディレクトリ名のエンコードに関す る問題に対処していません。 UNIX 系 OS の場合、システム全般で標準的に使用されるエンコードは EUC-JP であり、ファイル名/ディレクトリ名に日本語を使用する場合はエン コードに EUC-JP を使用します。また、FTP サーバとして Windows や Mac か ら日本語のファイル名を付けたファイル/ディレクトリを扱う場合は、シフト JIS を使用すると便利でしょう。 本パッチはこうした問題に対処すべく、iconv() 関数を利用してファイル I/O の前後でファイル名/ディレクトリ名を任意のエンコードに変換します。 また、本来 WebDAV 用に作ったパッチですが、Web ブラウズでディレクトリ の内容一覧を表示する autoindex パッチにも色々と手を加えてあり、従来発 生していた文字化けを防止する工夫も含まれています。 ■本パッチの戦略 Apache 2 がアーキテクチャ差異吸収ライブラリ libapr を経由して file I/O する点に注目し、file I/O のシステムコールを呼び出す部分の前後にエ ンコード変換ルーチンを入れてあります(言わば「水際変換」)。 あちらこちらで、特別なパッチ無しでも mod_encoding を使ってファイルシ ステム側を UTF-8 に設定して動いていた実績から、Apache 内部の処理が UTF-8 で問題ない事が分かっていますので、 Apache2 (フロントエンド) ↑mod_encoding (入力 URL の文字列変換) ↑↓ …[UTF-8] mod_dav (WebDAV プロトコル処理フロントエンド) ↑↓ …[UTF-8] mod_dav_fs (ファイルシステム用 WebDAV バックエンド) ↑↓ …[UTF-8] libapr (アーキテクチャ差異吸収レイヤ) ↑↓ …[任意のコード] システムコール という形にしてあります。 ■用意するもの ・Apache Web Server ver.2 (最新は 2.0.43) ・disk quota パッチ (010_diskquota.gz) ・エンコード変換パッチ (011_path_iconv.gz) ■使い方 0)必要なものをダウンロードし、同じディレクトリに置きます。 disk quota パッチ、エンコード変換パッチが gzip 圧縮されている場合は 解凍しておいて下さい。 1)Apache 2 のソースを展開し、diskquota パッチ、本パッチの順でパッチを 適用します。 # gzip -dc httpd-2.0.43.tar.gz | tar -xvf - # cd httpd-2.0.43 # patch -p2 < ../010_diskquota # patch -p2 < ../011_path_iconv 本パッチは、先に公開していた diskquota パッチを当てた後に適用するよう に作ってあります。そちらを使いたくない場合は手でパッチを当てて下さい。 2)Disk Quota を使用する場合は、そちらの設定を行って下さい。 詳しくは diskquota.txt を参照して下さい。 3)ファイル名のエンコーディングは EUC-JP 決め打ちになっています。 変更したい場合は ~httpd/srclib/apr/file_io/unix/path_iconv.h の #define FS_ENCODE "EUC-JP" を好きに変更して下さい。 4)Apache を普通にインストールします。勿論、WebDAV 機能を有効にする事を 忘れないで下さい。詳しくは ~httpd/INSTALL を参照して下さい。 ■制限事項 ・設定ファイルのパス名にも日本語を使えますが、設定ファイル中のパス名の エンコードは UTF-8 でなければなりません。 ・エンコード変換に iconv を使用していますが、iconv_hook の為の特別な配 慮はしていません。必要なら自分で hack して下さい。 ・1つのパス名の途中でエンコーディングを変えることはできません。 ・複数のエンコーディングを同時に扱えません。