ひとことで言うと
Content-Disposition とは、HTTPレスポンスヘッダーの1つで、ブラウザにコンテンツの扱い方を伝えます。`inline` を指定するとブラウザ内で直接表示、`attachment` を指定するとダウンロードダイアログが開きます。`attachment; filename="report.html"` のように書けば、ダウンロードするファイル名まで指定できます。
HTMLファイルの場合、Content-Disposition が付いていない、または `inline` であればブラウザがHTMLとして解釈して表示します。共有サービスがどちらを返しているかによって、URLを開いたときに「ページが表示される」「ファイルが落ちてくる」という全く異なる体験になります。
- 相手がログインなしで開ける状態か確認する
- PCとスマホで最低1回ずつ表示を確認する
- 内部情報・個人情報・不要な外部送信が残っていないか見る
- レビュー期限と修正時の差し替え方を決めておく
HTML共有で関係する場面
ギガサイト便などの共有サービスでは、アップロードしたHTMLを「ブラウザで表示するURL」として提供するために `inline` を返すよう設定されています。もし誤って `attachment` を返す設定になっていると、共有URLを開いた相手がページを見る代わりにHTMLファイルをダウンロードする羽目になります。共有後に「URLを開いたらファイルが落ちてきた」という報告があれば、このヘッダーを疑ってください。
一方、成果物のHTMLを相手にダウンロードしてもらいたい場面(ソースコードを渡したい、オフラインで使ってほしい等)では `attachment` が有用です。共有サービスによっては「表示URL」と「ダウンロードURL」を使い分けられるものもあります。目的に応じてURLの種類を選ぶようにしてください。
よくある誤解
「Content-Disposition を付けなければブラウザは必ずHTMLとして表示してくれる」という前提は必ずしも正しくありません。ヘッダーがない場合、ブラウザは MIME タイプ(Content-Type)を見て表示か保存かを判断します。`text/html` であれば表示しますが、`application/octet-stream` が返っていると内容に関わらずダウンロード扱いになります。
「filename パラメータで拡張子を `.html` にすれば表示される」という誤解もあります。`attachment` が指定されている時点でダウンロードになり、filename の拡張子では変わりません。表示させるには `inline` を使うしかなく、Content-Type も `text/html; charset=utf-8` に合わせることが必要です。
安全に使うための注意点
共有サービスがユーザーの指定した filename をそのまま Content-Disposition に使っている場合、ファイル名にスラッシュや特殊文字を含めることでディレクトリトラバーサルの脆弱性を引き起こす実装が過去に存在しました。現代のサービスでは通常サニタイズされていますが、自分でサーバーを立てて共有機能を実装する場合は filename の検証を必ず行ってください。
HTMLをプレビューとして表示した後に「ダウンロードボタン」を提供する場合、JavaScriptの `<a download>` 属性とContent-Dispositionは独立した制御です。サーバー側が `attachment` を返している場合、`<a download>` を付けなくてもダウンロードになります。逆にサーバーが `inline` を返していて `<a download>` を付けると、ブラウザの実装によっては表示またはダウンロードのどちらかになります。
よくある質問
AI生成HTMLを共有URLで開いたらダウンロードになりました。表示に変えるにはどうすればいいですか?
サービス側が Content-Disposition: attachment を返しているのが原因です。サービスの設定でコンテンツタイプをHTMLとして公開する選択肢がないか確認してください。サービス側の仕様であれば、表示に対応した別のサービスを使う必要があります。
Content-Disposition の inline と attachment の違いを一言で教えてください。
inlineはブラウザ内でそのまま表示、attachmentはファイルとして保存を促す設定です。HTMLファイルを相手に見せたいなら inline、ソースを渡したいなら attachment を選びます。
Content-Disposition ヘッダーはHTMLの中で指定できますか?
いいえ、HTTPレスポンスヘッダーとして指定するもので、HTMLタグや meta タグでは代替できません。設定できるのはサーバーまたは共有サービスの管理画面のみです。HTMLだけを書いて共有する立場では直接コントロールできない項目です。