reroの日記

2005-05-24-Tue

SANRISEロゴ入りUSB携帯充電器

Web フォルダWebDAV

ApacheWebDAV 機能を WindowsWeb フォルダに対応させる話.

Digest 認証が掛かった WebDAV サーバを開けない

Digest 認証が掛かった WebDAV サーバWeb フォルダで開こうとしたとき,エラーが出て開けないことがある.


c:/Documents and Settings/rero/Local Settings/Temp/wecerr.txt

05/23/2005 07:44:00
HTTP 404 Not Found
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /_vti_bin/shtml.exe/_vti_rpc was not found on this server.</p>
<hr>
<address>Apache Server at 192.168.0.2 Port 80</address>
</body></html>

これは,WindowsWebフォルダでは,Digest 認証で OPTIONS メソッドが通らないことが原因らしい.Basic 認証では通るので,SSL + Basic 認証などではこの問題は起こらない模様.OPTIONS メソッドが通らないと,Web フォルダは /_vti_bin/shtml.exe/_vti_rpc という普通は存在しないファイル(Front Page Server Extensionsファイルらしい)を探しに行くのだろうか?

つまり,Digest 認証を使うときは <LimitExcept> ディレクティブで OPTIONS メソッドだけ認証を回避すればよい.


例.

<Location /dav>
    Dav On

    AuthType Digest
    AuthName "dav"
    AuthDigestFile "/etc/apache2/.htdigest"
    <LimitExcept OPTIONS>
        Require valid-user
    </LimitExcept>
</Location>
参考

OS Xにmod_auth_digestをインストール

WindowsWebフォルダはmod_auth_digestのダイジェスト認証に

対応しています。

ただし、OPTIONSリクエストはだめなようで、httpd.confでは、

<LimitExcept OPTIONS>
  require valid-user
</LimitExcept>

としてOPTIONSリクエスト時には認証しないようにする必要があるのでした。

_vti_inf.html や _vti_bin が見つからないというエラーログが残る

mod_headers - Apache HTTP サーバ

mod_setenvif - Apache HTTP サーバ


access_log や error_log に _vti_inf.html や _vti_bin (Front Page Server Extensionsファイルらしい)が見つからないというエラーログが残る.実害はないが,何となく気持ち悪い.


/var/log/apache2/access_log

192.168.0.5 - - [24/May/2005:21:24:54 +0900] "GET /_vti_inf.html HTTP/1.1" 404 272

192.168.0.5 - - [24/May/2005:21:24:54 +0900] "POST /_vti_bin/shtml.exe/_vti_rpc HTTP/1.1" 404 286

192.168.0.5 - - [24/May/2005:21:24:54 +0900] "OPTIONS /dav HTTP/1.1" 401 462

/var/log/apache2/error_log

[Tue May 24 21:24:19 2005] [error] [client 192.168.0.5] File does not exist: /var/www/localhost/htdocs/_vti_inf.html

[Tue May 24 21:24:19 2005] [error] [client 192.168.0.5] File does not exist: /var/www/localhost/htdocs/_vti_bin

この問題の対策は,Web サーバからの応答に

MS-Author-Via: DAV

というヘッダを付ければいいという解決法が各所で報告されている.(ただし,前述した Digest 認証の問題が解決していなければ,ログに残るエラーは消えない.)

httpd.conf の設定は以下のようになる.Header ディレクティブを使うには mod_headers が必要である.

<Location />
   Header add MS-Author-Via "DAV"
</Location>

これらのファイルは DocumentRoot へ探しに行こうとするので,<Location /> に書く必要がある.WebDAV ディレクトリである <Location /dav> などに設定しても駄目である.

また,これでは Web フォルダ以外から Web サーバアクセスしたときも余分なヘッダがついて気持ち悪いと感じるかもしれない.そのときは,以下のように User-Agent で Web フォルダかどうか判定して,Web フォルダの場合のみヘッダを付加すればよい.BrowserMatch ディレクティブを使うには mod_setenvif が必要である.

<Location />
    BrowserMatch "Microsoft Data Access Internet Publishing Provider .*" WEB_FOLDER
    Header add MS-Author-Via "DAV" env=WEB_FOLDER
</Location>

ただし,Web フォルダの User-Agent は

Microsoft Data Access Internet Publishing Provider Cache Manager

Microsoft Data Access Internet Publishing Provider DAV 1.1

Microsoft Data Access Internet Publishing Provider Protocol Discovery

Microsoft Data Access Internet Publishing Provider DAV

など色々ありそうなので正規表現で指定している.WindowsバージョンOffice XPインストールの有無,Web サーバのポートなどの違いで Web フォルダ自体の挙動が変わるらしい.

ちなみに,自分が tcpdump で確認した Web フォルダの User-Agent は

User-Agent: Microsoft Data Access Internet Publishing Provider DAV 1.1

だった.(Windows XP SP2, Office XPインストールApache のポートは 80)

参考

各種 WebDAV クライアントの挙動が説明されている.

nemuiDoc: WebDAVClients

WebDAVサーバの構築 #2 (WindowsXPからアクセスする)

Windows XP + WebClient

マイネットワークネットワークプレースを追加する から WebDAV サーバを追加しようとしたとき,認証失敗を繰り返して追加できない件.認証をキャンセルすると,「入力したフォルダは有効ではないようです。別のフォルダを選択してください。」というエラーメッセージが表示されて追加に失敗する.ちなみに,この問題は WebDAV ディレクトリに認証を掛けていなくても発生する.

クライアント側で対処する場合は,コントロールパネル>管理ツールサービス から WebClient を停止して,WebDAV サーバ追加後に,再び WebClient サービスを開始すればよい.(自分の場合は WebClient サービスは止めっぱなしにしている.特に必要ないから.)

サーバ側で対処する場合は,mod_encoding を導入して NormalizeUsername ディレクティブを設定するという解決法が各所で報告されている.今回の問題は,WebClient が認証時にサーバにユーザ名を送るとき,ユーザ名の文字列に勝手ホスト名を付け足して,そんなユーザいないよ,と怒られている模様.NormalizeUsername はその勝手に変えられたユーザ名を補正してくれるらしい.この方法は当方未確認.

参考

[SPS] Windows XP クライアントから FQDN の URL を指定して Web フォルダを作成できない