HTTP header(ヘッダ)のContent-Typeをapplication/octet-streamに指定すると、明示的にブラウザにダウンロードをさせることが出来る。つまり、pdf等デフォルトではプラグインで再生されるようになっているものでも、ダウンロード画面を開かせることが出来る。
ファイルのリンク先をphpにして、その中でheader()関数とreadfile()関数を使うという方法もある(php ダウンロードさせる で検索すればサンプルは腐るほどある)けど、やはりリンクはファイルへの直リンが望ましいのではないか(まあ、DL解析には向かないかもしれないけど)。
そういうときに、httpd.confを弄れるのなら方法はある(もしかしたら.htaccessでもいけるかも?)。
特定のディレクトリ(Directory、正規表現ならDirectoryMatch)/サイトパス(Location、正規表現ならLocationMatch)の特定の拡張子のファイルのみをAddTypeでoctet-streamに指定すれば良いのだ。
<LocationMatch “^/(.*)/upload_directory”>
<IfModule mime_module>
AddType application/octet-stream zip lzh rar 7z
</IfModule>
</LocationMatch>
これで、DocumentRootから1階層潜った先にあるupload_directoryに格納されたzip、lzh、rar、7zは全て明示的にダウンロードされることになる。
「これらのファイルはデフォルトでダウンロードじゃないか」と思う人も多いと思うが、どうやらIEではoctet-streamに指定されていないzipをダウンロードすると中身の拡張子が消えるという環境があるようだから、まあ指定しておくに損はない(この話についてはきちんとした検証が済んでいないので、参考程度に)。
ちなみに、例えば画像をoctet-streamに指定しても、imgタグで貼ることは出来るようだ。安心。