用 internal 配合 X-Accel-Redirect 实现受控下载,核心是后端校验权限并返回 X-Accel-Redirect 头,Nginx 内部重定向至 internal location 读取文件,既安全又高效;需正确配置 alias、Content-Type、Content-Disposition 等关键响应头。

用 internal 配合 X-Accel-Redirect 实现受控下载,核心是把权限校验、日志统计等逻辑交给后端,而把实际的文件读取和传输交给 Nginx——既安全,又省资源。
必须配置 internal 的 location 块
这是整个机制的前提。只有标记为 internal 的路径,Nginx 才拒绝浏览器直接访问,只响应后端通过 X-Accel-Redirect 发起的内部重定向请求。
- 路径不能暴露真实磁盘结构,建议用语义化前缀(如
/down/、/file/) -
alias比root更灵活,尤其当 URI 和文件系统路径不完全对应时 - 确保目标目录对 Nginx worker 进程可读,且路径末尾不重复拼接(
alias后要带斜杠,root不带)
示例配置:
location /down/ {internal;
alias /data/storage/;
}
后端响应中正确设置 X-Accel-Redirect 头
后端(PHP/Java/Python/Spring Boot 等)完成鉴权、计数、限速判断后,只需返回标准 HTTP 响应头,不输出文件内容。
-
X-Accel-Redirect的值必须是 Nginx 中已定义的internal路径开头,例如/down/2026/report.pdf - 必须显式设置
Content-Type(如application/pdf)和Content-Disposition(控制是否下载或内嵌) - 不要设置
Content-Length,Nginx 会自动计算并发送
PHP 示例:
header('Content-Type: application/pdf');header('Content-Disposition: inline; filename="report.pdf"');
header('X-Accel-Redirect: /down/2026/report.pdf');
利用扩展头实现精细化控制
Nginx 会识别并响应一系列以 X-Accel- 开头的控制头,无需后端读文件,全部由 Nginx 在内核态完成。
-
X-Accel-Limit-Rate: 512000→ 限速 500 KB/s(单位是字节/秒) -
X-Accel-Buffering: no→ 关闭缓冲,适合实时流或防止小文件延迟 -
X-Accel-Expires: 3600→ 设置该响应缓存有效期为 1 小时(配合proxy_cache使用) -
X-Accel-Charset: utf-8→ 影响 Content-Type 字符集声明(如含中文文件名时可辅助解析)
注意不可被覆盖的关键响应头
Nginx 不会修改你后端已设定的以下头部,所以必须由你保证其正确性:
-
Content-Type:决定浏览器是下载还是渲染,错误会导致乱码或无法打开 -
Content-Disposition:含attachment才触发下载,inline则尝试预览 -
Set-Cookie、Cache-Control、Expires、Accept-Ranges:这些都需后端主动设置,Nginx 不会补全或覆盖
若漏设 Content-Disposition,浏览器可能直接显示二进制内容;若未设 Accept-Ranges: bytes,则无法支持断点续传。











