ある記事に、コレを使えと書いてあった。
Content-Type: application/force-download


でも、なんかあやしい雰囲気…。


よく調べてみると、「application/force-download」というContent-Typeは定義されていないらしい。
ブラウザ的には「未定義なのでユーザーに任せる」、つまりダウンロードダイアログを開く、という処理になるので、結果的には「ダウンロードさせる」ことができる、ということで広まってしまった、いわゆるバッドノウハウってヤツらしい。
(そんなことを書いてある記事があった訳ではないが、状況からそう推察した)

正しくは、コレを使いましょう。
Content-Type: application/octet-stream


このMIME型は、対象となるデータのファイル形式が明確でない時や、 明確にしたくない時 (例えばWebブラウザーにファイルを解釈させず、 ダウンロードさせたい時) に使われることがあります。


結果的にはどちらも同じことになるから「application/force-download」でも正しい、という意見もあるかもしれない。
どういう理屈でそうなるのかを解っていて、あえてそうするなら良いかもしれない(あえてそうする意図がわからんが)。
ただ、それをわからずに「うまく行ったからイイや」で済ませていては良くない。
あまつさえ、その方法を他人に教えるなんて…。

と、偉そうに言ったものの、ワタクシメも良くやってしまいます。「うまく行ったからイイや」、って(*ノω・*)


【追記】
具体的には下記のようにするのが良いでしょう。
<?php
$filepath = 'path/to/file.pdf';
$filename = basename($filepath);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . filesize($filepath));
readfile($filepath);
exit;

ほぼ↓のパクりです(^o^;)