torinaブログ

DjangoとBootstrap4で作成したブログ
Python, Django, Kivy, Bootstrap, Apache等のメモです
ソースコード

ファイルをダウンロードさせる方法

Apache Apacheモジュール
2016年5月25日0:29
ファイルをダウンロードさせる方法です
ダウンロードさせたいのに、ブラウザ上でファイルを開いてしまう、ってときの対策になります
いくつかの方法があります。Apache2.2の例です


①aタグのdownload属性を使う
<a href="spam.png" download="ファイル名です">ダウンロードはここをクリック</a>

非常にお手軽ですが、対応していないブラウザがあります。IEなど


②Header Add Content-Disposition attachmentと指定する
Apacheのconfファイルの例です
<Directory /var/www/html/files>
    Header Add Content-Disposition attachment
</Directory>


特定のファイル、例えばpngとgifだけダウンロードさせたいならなこのようになります
Directoryの中にFilesを書くことが可能です
http://httpd.apache.org/docs/2.2/ja/sections.html
<Directory /var/www/html/test>
  <Files ~ "\.(gif|png)$">
    Header Add Content-Disposition attachment
  </Files>
</Directory>

.htaccessを使うことも勿論可能ですが、基本的には(使えるならば)confファイルを使うことをお勧めいたします

http://httpd.apache.org/docs/2.2/howto/htaccess.html
から抜粋


一般的に、サーバの主設定ファイルにアクセスできない場合を除いて、 .htaccess ファイルの使用は極力避けてください。 世の中には、例えば、ユーザ認証は常に .htaccess ファイルで 行なわなければならない、という誤解が広まっていますが、まったくそんなことは ありません。ユーザ認証の設定はサーバ主設定ファイルに書くことができ、 実際、その方がより良い設定方法です。

.htaccess ファイルはコンテンツ提供者がディレクトリ毎の 設定を行ないたいけれど、サーバシステムの root アクセス権限を持っていない という場合にのみ使うべきものです。サーバ管理者が頻繁に設定変更を行ないたくは ない、というときには個々のユーザが .htaccess ファイルを使って 自分で設定の変更を行なうことを許可した方が良いときもあるでしょう。 これは特に、ISP が複数のユーザのサイトを一つのマシンでホストしていて、 各ユーザが設定の変更をできるようにしたいようなときにあてはまります。

しかし、普通は可能であれば .htaccess ファイルの使用は 避けてください。.htaccess ファイルに書こうと考えるような すべての設定は、サーバの主設定ファイルの <Directory> セクションで同じように行なうことが できます。

.htaccess ファイルの使用を避ける理由は主に二つあります。

一つ目はサーバの性能の問題です。AllowOverride ディレクティブが .htaccess ファイルの設定を許可している場合は、Apache は 各ディレクトリで .htaccess ファイルを探します。 ですから、.htaccess ファイルを許可すると、実際に使用しているか どうかに関わらず、性能の低下を招くことになります! また、.htaccess ファイルは文書がリクエストされる度に読み込まれます。

さらに、Apache は適用すべきディレクティブを集めるために、すべての 上位のディレクトリの .htaccess ファイルを探す必要があることにも 注意してください。(ディレクティブが適用される方法を 参照してください。)ですから、/www/htdocs/example にある ファイルがリクエストされたときは、Apache は以下のファイルを調べます。

/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
ですから、そのディレクトリのそれぞれのファイルへのアクセスに対して、 上の例のファイルがまったく存在しないときでも、追加のファイルシステムの アクセスが行なわれることになります。(これは、.htaccess が / に対して有効になっているときの場合で、普通はそうなって いないことに注意してください。)

二つ目はセキュリティです。ユーザにサーバの設定を変更することを 許可することになりますので、あなた自身が管理できない変更をされる 恐れがあります。ユーザにこの特権を与えるのが良いのかどうか、十分 検討してください。また、ユーザに与える権限が必要なものよりも少なすぎると、 余分な技術サポート報告を受け取るようになる可能性が高いことにも 注意してください。確実に、ユーザにどの程度の権限を与えたか明確に告げるように してください。AllowOverride に 何を設定したかということと、関連する文書を示すことで、 後々の混乱をぐっと減らすことが できます。

ところで、ディレクティブの書かれた .htaccess を /www/htdocs/example に置くことと、同じディレクティブを 主サーバ設定の Directory セクション <Directory /www/htdocs/example> に書くことは 完全に等価です:

/www/htdocs/example の .htaccess ファイル:

/www/htdocs/example の .htaccess ファイルの 内容

AddType text/example .exm
httpd.conf のセクション file

<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>
しかし、この設定はサーバ設定ファイルに書いた方がパフォーマンスの 低下が少なくなります。ファイルがリクエストされる度に 読み込まれる代わりに、Apache の起動時に 1 回だけ読み込めば よくなるからです。

AllowOverride ディレクティブの 値を none に設定することで .htaccess ファイル の使用を完全に無効にすることができます。

AllowOverride None



こちらはDjango、サーバサイドのプログラム例です
Djangoのコードですが、これはDjangoに限らず使えます。
HTTPレスポンスに指定しています
html = "<html><head></head><body><h1>aaa</h1></body></html>"
r = HttpResponse(html, content_type='text/html')
r['Content-Disposition'] = 'attachment; filename=foo.html'
return r


参考
https://docs.djangoproject.com/en/1.8/ref/request-response/
https://docs.djangoproject.com/en/1.8/search/?q=attachment



③Addtypeで上書きする

これは.confや.htaccessの例です。pngをダウンロードさせています。
<Directory /var/www/html/files>
    Addtype application/octet-stream .png
</Directory>


この方法でもダウンロードさせれますが、IEがうまく動作しませんので、②のContent-Disposition attachmentと一緒に使うとよいです。

サーバサードのHTTPレスポンスだと、このようになります。
html = "<html><head></head><body><h1>aaa</h1></body></html>"
r = HttpResponse(html, content_type='application/octet-stream')  # ここが変わりました
r['Content-Disposition'] = 'attachment; filename=foo.html'
return r


こちらも、②のContent-Disposition attachmentと一緒に使うとよいです。

ちょっと脱線しますが、
ApatchデフォルトのMIMEタイプの設定はこんな感じでで見れます(CentOS6 Apache2.2)
vim /etc/mime.types


ただ、ここを直接編集はしないほうがいいです
AddTypeの説明から抜粋


この新しいマッピングは既にあるマッピングに追加され、同じ拡張子 extension のためのマッピングを上書きします。
このディレクティブは MIME タイプファイル (TypesConfig ディレクティブを参照) に無いマッピングを追加するために使用することができます。

新しい MIME タイプは、TypesConfig ファイルを変更するのではなく、AddType ディレクティブを使って追加することが推奨されています。



TypesConfigの説明から抜粋


必要ところを AddType で 上書きする、という方法で httpd.conf を簡略にします。
mime.types はサーバをアップグレードしたときに 置き換えられるかもしれないので、そのファイルを直接 編集しないでください。



参考
http://httpd.apache.org/docs/2.2/ja/mod/mod_mime.html