在 Nginx 中,若要将 HTTP 响应报文强制设置为文件下载(而非浏览器直接显示内容),可通过修改响应头 Content-Disposition
实现。以下是具体配置方法:
1. 单个文件的下载配置
若要对特定文件类型(如 .pdf
、.zip
)强制下载:
location ~* \.(pdf|zip)$ {
add_header Content-Disposition "attachment; filename=$request_filename";
}
attachment
表示强制下载。$request_filename
会自动填充客户端请求的文件名。
2. 动态路径文件的下载
若需从动态路径(如 /download/xxx
)返回文件:
location /download/ {
# 隐藏真实路径(可选)
internal;
# 设置下载头
add_header Content-Disposition "attachment; filename=$arg_filename";
# 指定文件存储目录
alias /path/to/files/;
}
- 通过 URL 参数传递文件名:
/download/file123?filename=document.pdf
3. 代理服务的下载配置
若 Nginx 作为反向代理,需确保后端服务不覆盖 Content-Type
:
location /api/download {
proxy_pass http://backend;
# 强制覆盖后端可能的错误头
proxy_hide_header Content-Disposition;
add_header Content-Disposition "attachment";
}
4. MIME类型控制
某些浏览器会根据 Content-Type
决定行为,可显式设置为二进制流:
location /files/ {
types { }
default_type application/octet-stream;
add_header Content-Disposition "attachment";
}
验证方法
使用 curl
检查响应头:
curl -I http://your-domain.com/file.pdf
应返回:
HTTP/1.1 200 OK
Content-Disposition: attachment; filename="file.pdf"
常见问题
- 中文文件名乱码:需转义 UTF-8 编码:
add_header Content-Disposition 'attachment; filename*=UTF-8''"%e4%b8%ad%e6%96%87.pdf"';
- 性能优化:大文件下载建议启用
sendfile on;
。
按需调整上述配置即可实现灵活的下载控制。
内容由零声教学AI助手提供,问题来源于学员提问