多くのテストと試行を調査して試した後、header()
機能に関するいくつかの事実readfile()
や類似の事実を発見しました。
まず、header()
さまざまなブラウザとの互換性の問題があることを知っておく必要があります。したがって、完璧な機能を探そうとしないでください。問題はphp関数ではなく、ダウンロードヘッダーを分析する方法が異なるブラウザーであるため、すべてのブラウザーが異なる動作をします。ご存知かもしれませんが、最大のトラブルメーカーは IE です。
問題を修正して を使用して機能させたい場合はheader()
、いくつかのヘッダーの詳細 ( など) を追加/強制する必要がありますがContent-Type
、これは php コードでは不可能です。何度やっても、なかなかうまくいきません。これについてはあまり情報がありませんがContent-Type
、実際の前にヘッダーを追加しても機能しないことはわかっていますheader()
。それらは完全に異なる目的のためのようです。
必要なヘッダーを追加してreadfile()
代わりに関数を使用すると、正常に機能します。ただし、この関数は、呼び出しているファイル/URL をメモリにロード/読み取ることを知っておく必要があります。これは大きな問題になる可能性があり、Web サーバーの速度が低下する可能性があります。最悪の場合、クラッシュすることもあります。これは、ダウンローダーが多すぎるか、ファイルが多い場合に発生する可能性があります。
残念ながら、前に述べたように、php コードでこれを修正することはできません。この問題を解決するために私がしたことは、Web サーバー vhost にヘッダーを追加することでした。
NginX:
location ~ ^/.*\.mp3$ {
add_header Pragma "public";
add_header Expires "0";
add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
add_header Content-Disposition "attachment";
add_header Content-Type "application/force-download";
add_header Content-Type "application/octet-stream";
add_header Content-Type "application/download";
add_header Content-Transfer-Encoding "binary";
}
私の場合、ユーザーがダウンロードする必要のあるファイルは mp3 形式でした。ただし、それを変更したり、グローバル ディレクティブを設定したりして、任意の形式で動作できるようにすることができます。