2011年12月2日金曜日

Zend FrameworkでContent-Dispositionヘッダが二行出る

Zend Frameworkを使用しているWebアプリで
あるxlsファイルをダウンロードさせようと
$filename = 'attachment; filename="Download.xls"';
$resp = $this->getResponse();
$resp->setHeader('Content-Type', 'application/vnd.ms-excel');
$resp->setHeader('Content-Disposition', $filename);
$resp->appendBody(file_get_contents($filepath));
$resp->sendResponse();
みたいに書いた。

動かしてみたら問題なく動いた。

と思ったら、他の数人からChromeでアクセスした際に
エラー 349 (net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION): 複数の Content-Disposition ヘッダーを受信しました。これは、HTTP レスポンス分割攻撃を防ぐために禁止されています。
と出るとの話を聞いた。

自分もChromeなのに別に何も出ない。

一体どう複数なんだいとパケットキャプチャ。
HTTP/1.1 200 OK
Date: ■■■■■■■■■■■■
Server: ■■■■■■■■■■■■■
X-Powered-By: PHP/5.3.4
Expires: ■■■■■■■■■■■■■
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Disposition: attachment; filename="Download.xls"
Content-Disposition: attachment; filename="Download.xls"
Connection: close
Transfer-Encoding: chunked
Content-Type: application/vnd.ms-excel
ぐうの音も出ない程に複数。

同僚の人からアドバイスをゲット。
第三引数をtrueにして上書きにすればいいのでは、とのこと。

変更してみた。
$resp->setHeader('Content-Disposition', $filename, true);
ヘッダが正しく一行だけ出るようになった。

でもソース内で他にContent-Dispositionを設定している所なんかない。
(そもそも上の例でこそファイル名をDownloadで固定にしているが実際はその場で作成している)

なんなの。

1 件のコメント:

  1. ファイル名にカンマが含まれているときに出ました。

    返信削除