HTTPD.CONFのブラウザマッチ処理
                    石田 精一郎
             Twitter: @sechiro
(自己紹介は割愛)
本題
お題 212-223:ブラウザマッチ処理
 BrowserMatch は SetEnvIf ディレクティブの 特例で、
  User-Agent HTTP リクエストヘッダに基づいて 環境変
  数を設定します。(コピペ)
 微妙なブラウザに対応するためのサーバ側の対応が
  書いてあります。
 設定されているUser-Agentからのアクセスされた場合、
  対応する環境変数を設定します。
コメント付きで、お題の内容を確認
   大きく二つに分かれてます
    # The following directives modify normal HTTP response behavior to
    # handle known problems with browser implementations.
    #
    BrowserMatch "Mozilla/2" nokeepalive
    BrowserMatch "MSIE 4¥.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    BrowserMatch "RealPlayer 4¥.0" force-response-1.0
    BrowserMatch "Java/1¥.0" force-response-1.0
    BrowserMatch "JDK/1¥.0" force-response-1.0
    #
    # The following directive disables redirects on non-GET requests for
    # a directory that does not include the trailing slash. This fixes a
    # problem with Microsoft WebFolders which does not appropriately handle
    # redirects for folders with DAV methods.
    # Same deal with Apple's DAV filesystem and Gnome VFS support for DAV.
    #
    BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
    BrowserMatch "MS FrontPage" redirect-carefully
    BrowserMatch "^WebDrive" redirect-carefully
    BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
    BrowserMatch "^gnome-vfs/1.0" redirect-carefully
    BrowserMatch "^XML Spy" redirect-carefully
    BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
まずは上の方
# The following directives modify normal HTTP
response behavior to handle known problems
with browser implementations.

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4¥.0b2;" nokeepalive
downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4¥.0" force-response-
1.0
BrowserMatch "Java/1¥.0" force-response-1.0
BrowserMatch "JDK/1¥.0" force-response-1.0

⇒一部の変なHTTP実装をしてるブラウザ対応です。
ドキュメントを確認
   force-response-1.0
       これが設定されていると、HTTP/1.0 リクエストを発行するクライアントに対して
        は 常に HTTP/1.0 で応答するようになります。この機能は、 元々は AOL のプ
        ロキシの問題のために実装されました。HTTP/1.0 クライアントの中には、
        HTTP/1.1 の応答を返されると正しく動作しないものがあるかもしれません。 こ
        の機能を使用することで、そのようなクライアントとの間の互換性問題を解決で
        きます。
    ・・・
   おかしな挙動をするクライアントに対してプロトコルの動作を変更する
       クライアントに関する既知の問題に対処するために、以下の行を httpd.conf に
        入れることを推奨しています。
       古いバージョンの Apache では、クライアントの問題に対応するために
        httpd.conf に次の行を加えるよう推奨されていましたが、 今となっては、問題と
        していたクライアントは実際には見かけることは なくなってきたので、この設定
        はもはや必要ないかもしれません。

                         コピペ元:http://httpd.apache.org/docs/2.2/env.html

⇒互換性の問題に苦労してきた歴史が垣間見えます。。。
下の方は一部のWebDAVクライアント対応
 # The following directive disables redirects on non-GET requests
for a directory that does not include the trailing slash.
 # This fixes a problem with Microsoft WebFolders which does not
appropriately handle redirects for folders with DAV methods.
# Same deal with Apple„s DAV filesystem and Gnome VFS
support for DAV.
BrowserMatch “Microsoft Data Access Internet Publishing
Provider” redirect-carefully
BrowserMatch “MS FrontPage” redirect-carefully
BrowserMatch “^WebDrive” redirect-carefully
BrowserMatch “^WebDAVFS/1.[0123]” redirect-carefully
BrowserMatch “^gnome-vfs/1.0” redirect-carefully
BrowserMatch “^XML Spy” redirect-carefully
BrowserMatch “^Dreamweaver-WebDAV-SCM1” redirect-
carefully

⇒「GET」以外の要求で「the trailing slash」がない場合リダイレクトしない?
  「redirect-carefully」って何???
“The Trailing Slash” って?




  こんな感じにURLでディレクトリを指定するときに付ける、
  最後のスラッシュのことです。
普通のブラウザはどう反応するかというと、




 最後のスラッシュなしでアクセスすると、
 いつの間にかスラッシュありのアドレスに移動します。
どうしてこうなる?
① 最後のスラッシュなしのURLを指定すると、



② こういうお返事が返ってきて、
 <title>301 Moved Permanently</title>
 </head><body>
 <h1>Moved Permanently</h1>
 <p>The document has moved <a href="http://www.example.com/dav/">here</a>.</p>



③ ブラウザは「301」の反応はユーザに見せずに、リダイレクト先のアド
レスで同じ操作を繰り返します。
WebDAVのクライアントの場合―普通の例

   Windows Vista/7の標準機能を使った場合
       Apacheのアクセスログを見ると、
           “PROPFIND /dav HTTP/1.1" 301 324 "-"
                 "Microsoft-WebDAV-MiniRedir/6.0.6002”
           “PROPFIND /dav/ HTTP/1.1" 207 836 "-"
                 "Microsoft-WebDAV-MiniRedir/6.0.6002”
                      (PROPFINDはWebDAVのメソッド)

    ⇒基本的にブラウザと同じ動き

   Linuxでcadaverを使った場合
       接続指定先が必ずディレクトリになるので、クライアント側で
        先にTrailing Slashを補完してから接続する。
WebDAVのクライアントの場合―悪い例

   お題の中に出てくる「WebDrive」で実験
       設定をコメントアウトしてApacheを再起動
            # BrowserMatch “^WebDrive” redirect-carefully
       そのあと、WebDAVのディレクトリにアクセスすると、、、




        ⇒301をそのまま返してきた!!!
        そんなWebDAVクライアントでd(ry
デフォルト設定のままだと

   デフォルト設定に戻して接続すると、
       Trailing Slashなしでも、 Trailing Slashありと同じレスポンス
        が返されます。
           "OPTIONS /dav HTTP/1.1" 200 - "-" "WebDrive 9.16.2391 DAV“
           "PROPFIND /dav HTTP/1.1" 207 885 "-" "WebDrive 9.16.2391 DAV“
   つまり、




        一番いいレスポンスを頼む!!
後半のブラウザマッチが意味するもの

   「redirect-carefully」はGET以外のメソッドに対して、リ
    ダイレクトで正しいアドレスに誘導するのではなく、サー
    バ側で空気を読んでお返事してあげるオプションです。
       ちなみにソースの該当部分はこんな感じでした。
        httpd-2.2.3¥modules¥mappers¥mod_dir.cより
        /* Only redirect non-get requests if we have no note to warn
        * that this browser cannot handle redirs on non-GET requests
        * (such as Microsoft's WebFolders).
        */
        if ((r->method_number != M_GET)
               && apr_table_get(r->subprocess_env, "redirect-carefully")) {
            return DECLINE
        }



   WebDAVクライアントは、実装がばらついてるみたいな
    のでご注意!
ここまでです。

第1回Webサーバ勉強会 - 212-223 ブラウザマッチ処理

  • 1.
    HTTPD.CONFのブラウザマッチ処理 石田 精一郎 Twitter: @sechiro
  • 2.
  • 3.
  • 4.
    お題 212-223:ブラウザマッチ処理  BrowserMatchは SetEnvIf ディレクティブの 特例で、 User-Agent HTTP リクエストヘッダに基づいて 環境変 数を設定します。(コピペ)  微妙なブラウザに対応するためのサーバ側の対応が 書いてあります。  設定されているUser-Agentからのアクセスされた場合、 対応する環境変数を設定します。
  • 5.
    コメント付きで、お題の内容を確認  大きく二つに分かれてます # The following directives modify normal HTTP response behavior to # handle known problems with browser implementations. # BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4¥.0b2;" nokeepalive downgrade-1.0 force-response-1.0 BrowserMatch "RealPlayer 4¥.0" force-response-1.0 BrowserMatch "Java/1¥.0" force-response-1.0 BrowserMatch "JDK/1¥.0" force-response-1.0 # # The following directive disables redirects on non-GET requests for # a directory that does not include the trailing slash. This fixes a # problem with Microsoft WebFolders which does not appropriately handle # redirects for folders with DAV methods. # Same deal with Apple's DAV filesystem and Gnome VFS support for DAV. # BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully BrowserMatch "MS FrontPage" redirect-carefully BrowserMatch "^WebDrive" redirect-carefully BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully BrowserMatch "^gnome-vfs/1.0" redirect-carefully BrowserMatch "^XML Spy" redirect-carefully BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
  • 6.
    まずは上の方 # The followingdirectives modify normal HTTP response behavior to handle known problems with browser implementations. BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4¥.0b2;" nokeepalive downgrade-1.0 force-response-1.0 BrowserMatch "RealPlayer 4¥.0" force-response- 1.0 BrowserMatch "Java/1¥.0" force-response-1.0 BrowserMatch "JDK/1¥.0" force-response-1.0 ⇒一部の変なHTTP実装をしてるブラウザ対応です。
  • 7.
    ドキュメントを確認  force-response-1.0  これが設定されていると、HTTP/1.0 リクエストを発行するクライアントに対して は 常に HTTP/1.0 で応答するようになります。この機能は、 元々は AOL のプ ロキシの問題のために実装されました。HTTP/1.0 クライアントの中には、 HTTP/1.1 の応答を返されると正しく動作しないものがあるかもしれません。 こ の機能を使用することで、そのようなクライアントとの間の互換性問題を解決で きます。 ・・・  おかしな挙動をするクライアントに対してプロトコルの動作を変更する  クライアントに関する既知の問題に対処するために、以下の行を httpd.conf に 入れることを推奨しています。  古いバージョンの Apache では、クライアントの問題に対応するために httpd.conf に次の行を加えるよう推奨されていましたが、 今となっては、問題と していたクライアントは実際には見かけることは なくなってきたので、この設定 はもはや必要ないかもしれません。 コピペ元:http://httpd.apache.org/docs/2.2/env.html ⇒互換性の問題に苦労してきた歴史が垣間見えます。。。
  • 8.
    下の方は一部のWebDAVクライアント対応 # Thefollowing directive disables redirects on non-GET requests for a directory that does not include the trailing slash. # This fixes a problem with Microsoft WebFolders which does not appropriately handle redirects for folders with DAV methods. # Same deal with Apple„s DAV filesystem and Gnome VFS support for DAV. BrowserMatch “Microsoft Data Access Internet Publishing Provider” redirect-carefully BrowserMatch “MS FrontPage” redirect-carefully BrowserMatch “^WebDrive” redirect-carefully BrowserMatch “^WebDAVFS/1.[0123]” redirect-carefully BrowserMatch “^gnome-vfs/1.0” redirect-carefully BrowserMatch “^XML Spy” redirect-carefully BrowserMatch “^Dreamweaver-WebDAV-SCM1” redirect- carefully ⇒「GET」以外の要求で「the trailing slash」がない場合リダイレクトしない? 「redirect-carefully」って何???
  • 9.
    “The Trailing Slash”って? こんな感じにURLでディレクトリを指定するときに付ける、 最後のスラッシュのことです。
  • 10.
  • 11.
    どうしてこうなる? ① 最後のスラッシュなしのURLを指定すると、 ② こういうお返事が返ってきて、 <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved <a href="http://www.example.com/dav/">here</a>.</p> ③ ブラウザは「301」の反応はユーザに見せずに、リダイレクト先のアド レスで同じ操作を繰り返します。
  • 12.
    WebDAVのクライアントの場合―普通の例  Windows Vista/7の標準機能を使った場合  Apacheのアクセスログを見ると、  “PROPFIND /dav HTTP/1.1" 301 324 "-" "Microsoft-WebDAV-MiniRedir/6.0.6002”  “PROPFIND /dav/ HTTP/1.1" 207 836 "-" "Microsoft-WebDAV-MiniRedir/6.0.6002” (PROPFINDはWebDAVのメソッド) ⇒基本的にブラウザと同じ動き  Linuxでcadaverを使った場合  接続指定先が必ずディレクトリになるので、クライアント側で 先にTrailing Slashを補完してから接続する。
  • 13.
    WebDAVのクライアントの場合―悪い例  お題の中に出てくる「WebDrive」で実験  設定をコメントアウトしてApacheを再起動  # BrowserMatch “^WebDrive” redirect-carefully  そのあと、WebDAVのディレクトリにアクセスすると、、、 ⇒301をそのまま返してきた!!! そんなWebDAVクライアントでd(ry
  • 14.
    デフォルト設定のままだと  デフォルト設定に戻して接続すると、  Trailing Slashなしでも、 Trailing Slashありと同じレスポンス が返されます。  "OPTIONS /dav HTTP/1.1" 200 - "-" "WebDrive 9.16.2391 DAV“  "PROPFIND /dav HTTP/1.1" 207 885 "-" "WebDrive 9.16.2391 DAV“  つまり、 一番いいレスポンスを頼む!!
  • 15.
    後半のブラウザマッチが意味するもの  「redirect-carefully」はGET以外のメソッドに対して、リ ダイレクトで正しいアドレスに誘導するのではなく、サー バ側で空気を読んでお返事してあげるオプションです。  ちなみにソースの該当部分はこんな感じでした。 httpd-2.2.3¥modules¥mappers¥mod_dir.cより /* Only redirect non-get requests if we have no note to warn * that this browser cannot handle redirs on non-GET requests * (such as Microsoft's WebFolders). */ if ((r->method_number != M_GET) && apr_table_get(r->subprocess_env, "redirect-carefully")) { return DECLINE }  WebDAVクライアントは、実装がばらついてるみたいな のでご注意!
  • 16.