爲了控制靜態文件下載,通常方法須要PHP用file_get_contents讀取文件,再傳給客戶端。php
節省資源的方法是利用nginx的x-sendfile模塊nginx
原理是 nginx 上設置一個特殊資源目錄,客戶端沒法直接讀取,須要通過php許可後才能下載。app
一、設置nginxspa
location /request/uri/ { internal; alias /real/path/; }
目錄 /request/uri/ 被設置爲 internal, 因此客戶端沒法直接訪問。utf-8
alias 對應的文件所在真實目錄,通常這個目錄不在公開目錄下,也沒法訪問。資源
注意要設置生效。文檔
nginx -s reload
二、訪問phpget
// 驗證是否有權限: 費這麼大勁就是爲了這個 // 獲取要下載的文件名稱: $p_file = '/request/uri/filename.ext'; // 告訴nginx放行: header('Content-type: application/octet-stream'); // 這裏的$fileName = basename($p_file) 也就是 filename.ext header('Content-Disposition: attachment; filename="' . $fileName . '"'); // nginx sendfile header('X-Accel-Redirect: '.$p_file);
還有一些控制選項,須要提早 X-Accel-Redirect 發送it
X-Accel-Limit-Rate: 1024 X-Accel-Buffering: yes|no X-Accel-Charset: utf-8io
文檔:https://www.nginx.com/resources/wik