2005年07月20日(水) [長年日記]
■ [web][windows] IE6でダウンロードダイアログが2回表示される
問題
ウェブアプリケーションでHTTPヘッダに
Content-Disposition:attachment; filename="foo.csv" Content-Type: application/octet-stream
を付与することでウェブブラウザにファイルをダウンロードするかどうかを問い合わせるダイアログを表示させようとした。
で、手元のIE6だと「開く」「保存」「キャンセル」「詳細情報」を選ぶダイアログが表示されるのだけれど、ここで「開く」を選んだときに再度同じダイアログが表示されてしまう、という問題に遭遇した。2度目のダイアログで「開く」を選ぶと正しくファイルの内容が表示される。
調査
別のウェブアプリケーションで試すと、ダイアログが2回表示されるという問題は発生しない。HTTPヘッダを比べると、問題が発生する方だけCache-Controlヘッダなどが付与されておりこの辺が怪しい。
で、テスト用に
<?php header('Content-type: application/octet-stream'); header('Expires: Thu, 19 Nov 1981 08:52:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); header('Pragma: no-cache'); header('Content-Disposition: attachment; filename="test.csv"'); echo 'test,test,test'; ?>
というPHPコードを書いて再現させようとしたが、
Internet Explorer では、xxx.xxx.xxx.xxx - xxx.xxx をダウンロードできません。
このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。
というエラーになってしまった。マイクロソフトのサイトにあるContent-Disposition: attachemnt と Cache-Control: no-cache によるダウンロードの問題が発生しているように思われる。(追記:本件はInternet Explorer が SSL 経由によるファイルのダウンロードで "No-Cache" ヘッダーを処理できないが原因かもしれない。当時SSLを使用していたかは覚えていないが、エラーメッセージはこちらと一致する。)
では何故件のウェブアプリケーションではこのエラーが表示されないのか。どちらのプログラムが返すHTTPヘッダも同じに見えるのだが。
これ以上先に進めなくて、結局どのような場合にダウンロードのダイアログが2回表示されるのかは分からなかった。
回避方法
現象はよく分からないままだが、回避方法はある。Content-Dispositionヘッダの値を「attachment」以外の文字列に設定すればよい。attachmentと書きたいけれど、こう書くと変な動作をするのだから仕方ない。
(追記)
@IT会議室に同じような話題があった。
ここに、POSTだと発生しGETだと発生しないという説が書かれていた。あと、マイクロソフトのサポート技術情報にもあるんだな。
ここには
この問題を解決するには (Internet Explorer 5.5 のみ)、Service Pack 2 にアップデートします。
とあるけど、IE6で起こっている。現象は同じでも原因は違うのかも。
(追記2)
はてなにも話題があった。
- 送信方法が POST の場合、HTTP ヘッダの Content-Disposition を外すかレジストリを操作することにより回避可能
とあるけどレジストリのどこを操作すればいいのだろう。
(追記3)
2002年のPHP-users MLに、session_cache_limiter()を使用して解決したという話があったのでメモ(ダイアログが2回表示される問題ではないが)。
あと、Content-DispositionヘッダについてはRFC2183で規定されていたのでその日本語訳をメモ。
- インターネットメッセージ中にて示される提示的情報: Content-Disposition ヘッダフィールド (Studying HTTP)
■ やること
- オーブンレンジ用べんり棚
- ブラウンの安い電動歯ブラシ買う
- 蛍光灯を捨てる
- 請書
- クリーニング
- 清掃用具
- 銀行へ行け
ダイアログボックス2回表示の問題で、同様に困っています。<br>このページはとても参考になりました。<br>ありがとうございました!
「黒い画面⇔白黒の縦じま」を繰り返していたのですが、<br>1時間ほど置いていましたら、正常に動作するようになりました。<br>非常に参考になりました。ありがとうございました。
投稿ミスです。すいません。