第1回webサーバ勉強会 - 212-223 ブラウザマッチ処理
DESCRIPTION
第1回Webサーバ勉強会 http://atnd.org/events/9124 で担当した部分のスライドです。TRANSCRIPT
お題 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" nokeepaliveBrowserMatch "MSIE 4¥.0b2;" nokeepalive downgrade-1.0 force-response-1.0BrowserMatch "RealPlayer 4¥.0" force-response-1.0BrowserMatch "Java/1¥.0" force-response-1.0BrowserMatch "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-carefullyBrowserMatch "MS FrontPage" redirect-carefullyBrowserMatch "^WebDrive" redirect-carefullyBrowserMatch "^WebDAVFS/1.[0123]" redirect-carefullyBrowserMatch "^gnome-vfs/1.0" redirect-carefullyBrowserMatch "^XML Spy" redirect-carefullyBrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
# The following directives modify normal HTTP response behavior to handle known problems with browser implementations.
BrowserMatch "Mozilla/2" nokeepaliveBrowserMatch "MSIE 4¥.0b2;" nokeepalivedowngrade-1.0 force-response-1.0BrowserMatch "RealPlayer 4¥.0" force-response-1.0BrowserMatch "Java/1¥.0" force-response-1.0BrowserMatch "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
ドキュメントを確認
⇒互換性の問題に苦労してきた歴史が垣間見えます。。。
# 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-carefullyBrowserMatch “MS FrontPage” redirect-carefullyBrowserMatch “^WebDrive” redirect-carefullyBrowserMatch “^WebDAVFS/1.[0123]” redirect-carefullyBrowserMatch “^gnome-vfs/1.0” redirect-carefullyBrowserMatch “^XML Spy” redirect-carefullyBrowserMatch “^Dreamweaver-WebDAV-SCM1” redirect-carefully
⇒「GET」以外の要求で「the trailing slash」がない場合リダイレクトしない?
「redirect-carefully」って何???
下の方は一部のWebDAVクライアント対応
どうしてこうなる?
③ ブラウザは「301」の反応はユーザに見せずに、リダイレクト先のアドレスで同じ操作を繰り返します。
① 最後のスラッシュなしの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>
② こういうお返事が返ってきて、
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クライアントは、実装がばらついてるみたいなのでご注意!