Apache 2.0 for Win32 上で WebDAV を実現

2002/08/02 t.yukinari
2002/12/11 (改定1)
2005/03/09 (2.0.53)

◆はじめに

 自宅にサーバーを建てるにあたって、「サーバーといえば Apache だろう」という安直な考えで(笑)、Apache を導入することにしました。PC の OS が Windows2000 なので、Apache for Win32 に当然の如く決定。どうせなら最新を、ということで、Apache 2.0.39 を導入しました。
 設定もひととおり終わり、「単にサーバー建てているだけでは面白くないな〜」と思っていた矢先、友人が VPN を導入して、グローバルネットワーク共有(?)をやってるではないですか!「面白そうなんだけど、自宅のルーターには VPN 機能はないしな〜」と思ってた矢先、WebDAV なる http を使ってファイル共有できるシステムがあると知り、早速導入に踏み切りました。
 これは、Apache 2.0 for Win32 に WebDAV を実現するというフロンティアへ足を踏み出した、脅威に満ちた記録である(嘘)。
 同じように、Apache 2.0 for Win32 に WebDAV の導入を考えられてる方の参考になれば幸いです。

◆Apache 2.0 のインストール

 まず、最新版の Apache 2.0 を取得し、インストールします。
 Win32 版のバイナリは、「Apache Project」から取得できます。
 Apache のインストール、及び一般的な環境設定に関しては、各種参考資料などを利用して行ってください。

◆WebDAV の導入

 Apache 2.0 のデフォルトでは WebDAV の機能は導入されていませんので、以下の手順で WebDAV を導入します。

1) mod_dav の有効化

 Apache 2.0 には、WebDAV を実現するモジュール mod_dav が標準で用意されていますので、これを有効にするだけで WebDAV が実現できます。
 Apache のインストールフォルダ(デフォルトでは C:\Program Files\Apache Group\Apache2)内の conf フォルダ内にある httpd.conf を、以下のように変更・追加します。
# 以下のコメントを外して WebDAV モジュールを有効にします
LoadModule foo_module modules/mod_dav.so
LoadModule foo_module modules/mod_dav_fs.so

# 以下の記述を追加し、共有フォルダを設定します
<IfModule mod_dav.c>
    Alias /share "C:/Program Files/Apache Group/Apache2/htdocs/share"
    DAVMinTimeout 600
    DAVLockDB "C:/Program Files/Apache Group/Apache2/DAVLock"
    <Location /share>
        DAV On
    </Location>
</IfModule>
 上記 /share フォルダ名は、公開して共有したいフォルダ名ですので、任意の名前を付けて構いません。また、共有したいフォルダ(上記例では C:/Program Files/Apache Group/Apache2/htdocs/share)も任意に指定します。
 なお、DAVLockDB で指定しているフォルダは、任意のフォルダで構いません。ただし、フォルダは前もって作成しておく必要があります。

2) Apache の再スタート

 以上で設定は完了しましたので、Apache を再スタートして mod_dav モジュールを有効にします。
 タスクトレイ内の Apache のアイコンを左クリックし、メニューから Restart を選択して Apache を再起動します。

 もしも、ここで下記のようなダイアログが出たら、httpd.conf に記述した内容にミスがあります。正しく修正後、Apache を同様な手順で Start します。

3) Windows から参照

 これで、サーバー側の設定は出来たわけですから、クライアント側からそのフォルダを参照してみます。
 以下、 Windows2000 から Webフォルダで参照した例を示します。

 まず、デスクトップの [マイ ネットワーク] を開き、[ネットワーク プレースの追加] を実行します。表示されたウィザード画面にて、 http://localhost/share/ と入力します。(localhost は自PCサーバーのことを意味しますので、外の環境からアクセスする場合は、サーバーのホスト名または IPアドレスを指定します。)

 [次へ] ボタンを押すと、ウィザードの完了画面が出ます。[完了] ボタンを押して、ウィザードを終了します。

 すると、マイ ネットワーク内に Webフォルダが現れます。

4) ファイルのコピー

 現れた共有フォルダ内に、Windows からファイルを Drug&Drop などでファイルをコピーして、WebDAV が正しく動作することを確認します。
 同様に、共有フォルダ内から Windows 下にファイルをコピーして、サーバーからの取得に関しても動作確認します。

◆セキュリティの設定

 これで、WebDAV による共有フォルダが実現できたわけですが、このままだと誰にでも共有フォルダの中身を書き換えたり出来てしまいます。そこで、ユーザー認証を入れることにより、利用者制限を掛けることにします。

1) ユーザー認証の設定

 WebDAV の導入で設定した、httpd.conf における mod_dav の設定に対し、以下のように追加変更します。
<IfModule mod_dav.c>
    Alias /share "C:/Program Files/Apache Group/Apache2/htdocs/share"
    DAVMinTimeout 600
    DAVLockDB "C:/Program Files/Apache Group/Apache2/DAVLock"
    <Location /share>
        DAV On
        AuthUserFile "C:/Program Files/Apache Group/Apache2/_htpasswd"
        AuthName PublicFolder
        AuthType Basic
        Options Includes FollowSymLinks Indexes
        <Limit PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
            Require user orikisi
        </Limit>
    </Location>
</IfModule>
 これにより、ユーザー orikisi のみ、認証を得ることでこの共有フォルダにアクセス可能となります。

2) ユーザーの登録

 次に、ユーザー orikisi を登録しておく必要があります。ユーザーを登録しておくファイルは、AuthUserFile で指定したファイルです。(ファイル名は任意です。ただし、ファイルは Web から見えない場所に置くことが望ましい)
 ユーザーの登録には、Apache のインストールフォルダ内の bin フォルダにある htpasswd.exe を使用します。
 実行は、Apache のインストールフォルダから、コマンドラインプロンプトを開き、次のようにコマンドを実行します。(パスワードファイル・ユーザー名は、上記 httpd.conf 内に記述したものです)入力要求に対しパスワードを入力すれば、登録完了です。(※何故か実行でエラーが多発します。現在、原因不明です。)
C:\Program Files\Apache Group\Apache2> bin\htpasswd -c _htpasswd orikisi
Automatically using MD5 format on Windows.
New password: ********
Re-type new password: ********
Adding password for user orikisi
 Apache を再スタートし、エラーが発生しなければ設定完了です。

3) ユーザー認証

 これで、Webフォルダにアクセスするのに認証が必要になりました。
 WebDAV の導入で作成した localhost 上の share を一旦削除し、再度同様のネットワークプレースの追加を行います。すると今度は次のような認証画面が表示されます。

 ここで、上記 htpasswd.exe で設定したユーザー名及びパスワードを入力して [OK] を押せば、Webフォルダが追加されます。この Webフォルダを最初に参照する場合も認証が必要になります。

◆mod_encoding の導入

 これでセキュリティも万全!と思いきや、何と日本語名のファイルが共有フォルダに対してコピーも貼り付けも出来ません。
 調べていくうち、サーバー側(mod_dav)とクライアント側の Webフォルダとの日本語コードの扱いが異なることが判明しました。(詳しくは「Linux Square > 日本語ファイル名の利用とバージョン管理」参照のこと)
 さらに調べていくうち、これを解決するモジュールとして mod_encoding なるものが存在していることがわかり、早速導入を検討しました。ところが、このモジュールは基本的に Linux ベースのソースであり、Win32 環境下で利用するビルド条件などは用意されていませんでした。これでは実現不可能か?!
 あちこち調べても、ビルド条件はおろかバイナリのモジュールすら見つからない始末。こうなりゃ自分でやるしかない!
 というわけで、Win32 下で mod_encoding をビルド& Apache に組み込んだ手順を以下に説明します。

1) ソースの準備

 まず、「Apache Project」から Win32 版 Apache 2.0.39 のソース一式をダウンロードしてきます。mod_encoding は Apache のライブラリを使用していますので、Apache のソースも必要になります。
 加えて mod_encoding のソースを、「WebDAV Resources JP」からダウンロードしてきます。必要なファイルは、以下の2つです。
 これらのファイルを展開します。
 最初に Apache 2.0.39 のソース一式を、任意の場所に展開します。(例えば、C:\My Projects\httpd-2.0.39 に展開したとします。)
 次に、mod_encoding-20020611a を、Apache のソースを展開したフォルダ下の modules フォルダ内に encoding という名前で展開します。(例えば C:\My Projects\httpd-2.0.39\modules\encoding に展開します。)
 mod_encoding.c.apache2.20020611a は mod_encoding.c にリネームして、同じフォルダに上書きします。

2) ビルド環境

 展開した mod_encoding のソースには Win32 下でビルドする環境ファイルが入っていませんので、別途用意する必要があります。
 私の作成したビルド環境をダウンロードし、上記 encoding フォルダ内に展開します。 3) ソース修正

 実は、ソースはそのままではビルドできません。一部 Win32 用に修正する必要があります。
 展開したビルド環境の中にはソースの差分ファイルが入っていますので、patch ツールを使って、差分をソースに反映します。patch.bat をダブルクリックして、ソースを更新します。
 (※差分の更新には patch ユーティリティが必要です。「Programmers' toolbox」などから patch ユーティリティを取得し、実行ファイルをパスの通ったフォルダ内に置いてから実行してください。)

4) ビルド&インストール

 以上でビルド準備は出来ました。Microsoft Visual C++ 6.0(以下、VC++)を使用してビルドを行います。
  1. Apache のビルドには awk.exe が必要です。「Microsoft Windows での Apache のコンパイル」を参考に、awk.exe をダウンロードして、VC++ の実行パスフォルダに awk.exe を置いて下さい。
  2. httpd-2.0.39 フォルダ内の Apache.dsw をダブルクリックし、プロジェクトを VC++ で起動します。
    メニューから [ビルド(B)]-[ビルド(B)] を選択し、Apache をフルビルドします。
  3. encoding フォルダ内の mod_encoding.dsw をダブルクリックし、プロジェクトを VC++ で起動します。
    メニューから [ビルド(B)]-[ビルド(B)] を選択し、mod_encoding.so をビルドします。
  4. ビルドが完了すれば、encoding フォルダ下の Release フォルダ内に mod_encoding.so が出来ています。これを Apache インストールフォルダ下の modules フォルダ(デフォルトでは C:\Program Files\Apache Group\Apache2\modules)にコピーします。
 なお、ビルド済みの mod_encoding.so もありますので、ビルド環境がないかビルドが面倒な方は、これをダウンロードしてインストールしてください。(※2002/12/09: 2.0.39用に作成した mod_encoding.so は、それ以降のバージョンの Apache で動作しませんので、新たにビルドしたものを置いておきます)
 なお、「WebDAV Resources JP」で mod_encoding の新版が公開されていますが、現在鋭意対応(検討)中です。

5) mod_encoding の設定

 モジュールをインストールしたら、mod_dav 同様に httpd.conf に設定をする必要があります。これが難関でした。

 クライアントからのエンコード設定には、参考にした多くのサイトで AddClientEncoding を使用するように書かれていますが、実はこれでは正しく動作しません。
 まず、AddClientEncoding の記述に、仕様上の違いがあります。多くのサイトでは、
AddClientEncoding <encname> <user-agent>
と記述するよう書かれています。が、これはオリジナルの mod_encoding.c に基づく記述なのです。「WebDAV Resources JP」で提供されている mod_encoding の Apache2 対応版 は、
AddClientEncoding <agent> <enc> [<enc> ...]
となっています。つまり、今回使用したモジュールを有効にするための AddClientEncoding の記述は、後者でなければなりません。

 ところが、それでも日本語ファイルの扱いでエラーになります。原因は定かではないですが、AddClientEncoding で指定した agent の認識が正しく行われていないのではないかと思われます。

 他サイトを検索の結果、「Apache with WebDAV」なる Webページから、DefaultClientEncoding なるエンコード設定なるものがあることがわかりました。(ソース見れば、その存在すぐわかったのですけどね(^^ゞ) これを指定すれば、agent は自動認識されるようです。
 よって、httpd.conf への mod_encoding の設定は、以下のようにすればOKです。
# モジュールの定義群に以下を追加
LoadModule encoding_module modules/mod_encoding.so

# mod_encoding モジュールの設定追加
<IfModule mod_encoding.c>
    EncodingEngine On
    SetServerEncoding UTF-8
    DefaultClientEncoding JA-AUTO-SJIS-MS
    AddClientEncoding "cadaver/" EUC-JP
</IfModule>
 Apache を再スタートすれば、mod_encoding モジュールが有効になります。Webフォルダに対して日本語名のファイルのコピーや貼り付けを行い、正しく動作することを確認します。
 さぁ、WebDAV の世界を堪能して下さい!(笑)

◆オマケ

 以上で WebDAV は正しく動作するのですが、ログファイル error.log に以下のようなエラーログが残っています。
File does not exist: /home/httpd/html/_vti_inf.html
File does not exist: /home/httpd/html/_vti_bin/shtml.exe/_vti_rpc
 どうもこれは、Windows の Webフォルダは、サーバに FrontPage Server Extension があると認識して動作しているようなのです。
 これの対策は、Windows から送られてくる http ヘッダに対して特殊な文字列を付加することで回避できます。

 httpd.conf に対し、以下のように修正・追加します。
# 以下のコメントを外して mod_headers モジュールを有効にします
LoadModule headers_module modules/mod_headers.so

# mod_headers モジュールに対する設定追加
<IfModule mod_dav.c>
      :(略)
    <Location /share>
        DAV On
        Header add MS-Author-Via "DAV"
        AuthUserFile "C:/Program Files/Apache Group/Apache2/_htpasswd"
          :(略)
    </Location>
</IfModule>
 やはり Apache を再スタートし、Webフォルダに対してファイルのコピー&貼り付けを行って、エラーログが残らないことを確認します。

◆謝意

 当 WebDAV on Apache 2.0 for Win32 実現にあたって、直接協力いただいた方々に感謝の意を表します。

  k.takahashi さま
  t-matsui さま

◆参考文献