背景
ChromeやEdgeブラウザでいくつかのサイトを利用している際、PDFのダウンロードボタンをクリック時のエラーとなる事象に遭遇した。
↓日本語設定だと”インターネット接続をご確認ください”と表示されています。
Chromeのdevtoolでダウンロードボタン押下後の通信について、PDFダウンロードが成功するサイト、失敗するサイトの比較してみましたが、いずれも外部通信がボタン押下をトリガーとして実施されていなかったため、ブラウザの内部的な原因を疑い、Chromium Issue Trackerにissue登録をしてみた。
結論
私が切ったissueはこれ。
https://issues.chromium.org/issues/336965824
コメントの中で教えてもらったものは↓これ。
https://issues.chromium.org/issues/40293042
結論、本事象はChromiumの既知のissueでした。(10年前からのまだ検討中の様です。)
そのため、現時点での対応は下記ワークアラウンドを選択し、ブラウザ側で実施いただくorWEBサーバ管理側にcash設定を見直してもらう。となる。
本事象の再現条件
ブラウザの設定
ブラウザのPDFドキュメントデフォルトの動作がPDFビュワーで表示する設定になっている。
日本語設定だと、”ChroniumuでPDFを開く"となっているラジオボタンが選択されている状態。
WEBサーバ側の設定
PDFデータを返却するHTTPレスポンスヘッダにおいて、
- Cache-Control: no-store
- Content-Disposition: inline
が返却されていること。
https://issues.chromium.org/issues/336965824
私が上記issueに添付した、sample.zipで本事象が再現できる環境を用意しました。
Dockerさえあれば、ローカルで動作すると思うので、この記事の読者の方で自分がはまっている状態と一致しているかは確認いただけると思います。
原因
以下の2つの仕様によりダウンロードが失敗している。
- PDFビュワーのダウンロードボタン押下時は、ブラウザ内部で保有しているキャッシュをソースとして、ユーザ所定のローカルディレクトリへPDFファイルをエクスポートすることでダウンロードを実現している
- WEBサーバ側からは、no-store(一切の保存を許さない)設定でPDFファイルがブラウザに到達しているため、PDFビュワーに表示後、キャッシュを破棄している
これら2点により、ダウンロード時に参照すべきキャッシュが存在しないため、エラーが発生している。
ワークアラウンドについて
ブラウザ側
- PDFビュワーのダウンロードボタンではなく、印刷ボタンでPDF保存を選択する
- ブラウザの設定をPDFダウンロードする設定に変える
WEBサーバ側
- Cache-Controlヘッダを
no-store
からno-cache
等に変更する※
MDN Cache-Control
※ WEBサーバ側の変更の際は、キャッシュへの影響があるので、影響確認を実施した後に変更することを推奨いたします
Chromium側の対応方針について
https://issues.chromium.org/issues/40293042
上記のコメントを追っていくと、2012年から議論されているが
- ダウンロードボタン押下した際に、再度通信を行う
- 一時的にキャッシュを行う
の2案があるように見える。
私としては、とりあえず、ネットワークエラーと表示される点の是正や、
ダウンロードボタン自体押下できないようにグレーアウトするなどのをしたらどうか?と下記コメントを自分のissueに残してみたが、今日時点で反応はない。(自分でコード書ければいいのだがスキル不足)
まとめ
Chromiumのissueを自分で初めて起票したけど、みんな優しく教えていただき感謝。
Dockerで再現環境も作成し提示できたのは議論を加速することができたと感じている。