PHP 文件下載核心技術:HTTP 標頭控制下載行為、basename 保護目錄結構、readfile 發送內容、大文件分塊輸出避免記憶體溢出、Nginx X-Accel-Redirect 高性能方案、瀏覽器編碼兼容處理。
| 標頭 | 作用 | 範例 |
|---|---|---|
| Content-Type | MIME 類型,瀏覽器據此決定處理方式 | application/octet-stream (強制下載) |
| Content-Disposition | 附件模式 + 檔名 | attachment; filename="report.pdf" |
| Content-Length | 檔案大小,支援進度條、斷點續傳 | 1048576 |
| Content-Transfer-Encoding | 傳輸編碼 | binary |
| Accept-Ranges | 支援範圍請求 (斷點續傳) | bytes |
PHP 僅驗證權限、發送特殊標頭,Nginx 直接發送文件,釋放 PHP 進程、支援 sendfile 零拷貝、高併發優勢明顯。
location /protected/ {
internal; # 僅內部重定向可訪問
alias /var/www/files/; # 實際文件目錄
# 可選:限速、日誌、Token 驗證
}
| 文件類型 | 瀏覽器默認行為 | PHP 控制下載 |
|---|---|---|
| .rar / .zip | 直接下載 | 可控制檔名、權限、統計 |
| .avi / .mp4 / .mp3 | 直接播放 | 強制下載而非播放 |
| .jpg / .png / .pdf | 瀏覽器預覽 | 強制下載 |
basename() + 白名單目錄驗證filename*=utf-8''... + IE 兼容Range 請求頭 (需額外邏輯或 Nginx 原生)