IE9 では、ダウンロード時に通知バーが使われるようになりましたが、IIS のデフォルト設定では通知バーではなくダイアログがポップアップしてしまいいます。
通知バーではなくダイアログになってしまう
以前から少し気になっていたのですが、この件について「世の中は不思議なことだらけ」で情報を発信されているラムさんとディスカッションをしていたら、MS MVP for Client Operating System - Internet Explorer の hebikuzure さんが原因を追究され、Blog で「IE9 でダウンロードの際に通知バーではなくダイアログが表示される場合がある」情報を公開されました
IE9 の振舞いが判明したので、IIS でどのような設定をすればこの問題が解決するのかを解説します。
イントロダクションで既にネタばらし気味ですが(汗)、Windows Server 2008 R2 の IIS 7.5 (Windows Server 2008 の II7 でも同様)のデフォルトでは、IE9 のダウンロードが通知バーではなく、ダイアログポップアップになってしまいます。
ただし、全てのファイルダウンロードがポップアップになる訳ではなく、Office ドキュメントや、OS が標準で解凍機能を持っているアーカイブファイル(.zip等)だけがポップアップになるようです。
IIS デフォルトでのダウンロード
.docx はダウンロード(.zip .lzh も同様)
.pdf はブラウザに表示される
こんな感じで、IE9 から導入された通知バーが出てきません。
hebikuzure さんが解析された結果によると、HTTP ヘッダーで content-disposition: attachment を返さない場合はダイアログがポップアップするとのことです。
余談ですが、HTML ヘッダー(CGI環境変数)は CGI や ASP.NET 等のプログラムであれば動的にセットできますが、スタティックコンテンツの場合はあらかじめ HTML ヘッダーを仕込んでおく必要があります。
それでは、IIS に content-disposition: attachment を喋るように設定しましょう。
IIS の設定でダウンロードを通知バーにするには、html ファイルを格納しているフォルダとは別に、ダウンロードコンテンツを格納するフォルダーを別に作り、そのフォルダーをアクセスしたときにだけ content-disposition: attachment を返すように設定します。
ダウンロード専用フォルダーの HTTP 応答ヘッダーを設定
応答ヘッダーを追加
名前に content-disposition を、値に attachment を設定
IIS の設定をしたら、IE9 のキャッシュをクリア(ページをリロード)して、ダウンロードの動作を確認します。
リロードしてダウンロード
通知バーが表示されるようになった(.zip .lzh も同様)
.pdf はブラウザに表示される
hebikuzure さんの Blog にもありますが、全てのファイルダウンロードがポップアップになるわけではないようで、Office ドキュメントや Windows Explorer で開けるアーカイブ ファイル (.zip や .cab)だけがポップアップになるようです。
hebikuzure さんの Blog の追記に該当するケースの調査結果がありますので引用しておきます。
Office ドキュメントや ZIP、CAB などに限らず、IE から呼び出すことのできる COM インターフェイスを持つアプリケーションに関連付けられているファイルは、content-disposition: attachment ヘッダー無しではダウンロード ダイアログが表示される動作になっているとの事です。
僕が検証してポップアップになったのは、Office ドキュメント(.docx)、.zip、.lzh はポップアップになりましたが、.tar.gz は disposition: attachment 指定なしでも通知バーになりました。
.tar.gz は disposition: attachment ナシでも通知バーになる
ダウンロード専用フォルダーを作ったり、フォルダー個別の設定が面倒だからと言って .html が格納されているフォルダーに対して content-disposition: attachment を喋るように設定してしまうと、ページ移動のリンクもダウンロードになってしまい、別のページに移動できなくなってしまいます。
ダウンロードファイルを格納するフォルダーを別に作らないと悲しい事になってしまいますので注意が必要です。
.html が含まれているフォルダーに content-disposition:
attachment をセットすると...
ページ移動ではなく、移動先ページのダウンロードになってしまう
これは、エラーページの表示にも同じことが言えます。
例えば、IIS で MIME Type 未登録の拡張子を持つファイルをダウンロード対象にすると、IIS が 404 エラーになるのですが、このエラーページがダウンロード対象となってしまいます。
実運用としてほとんどありえないケースだと思いますが、この問題はエラー発生時の動作を URL実行かリダイレクトにすれば回避できます。(アタック対策としても良く使われる手法ですね)
エラー時の動作を変更する
対象のエラーを編集
URL実行か、リダイレクトに変更する
Copyright © MURA All rights reserved.