Nginx可通过location正则匹配.zip、.pdf等后缀并添加add_header Content-Disposition "attachment"实现强制下载,需注意add_header不继承、不重复定义、避免if块使用,并配合alias路径与缓存控制确保生效。

要让 Nginx 对特定后缀的文件(如 .zip、.pdf、.exe)强制浏览器下载而非直接打开,关键在于正确设置 Content-Disposition 响应头,并确保不被其他配置覆盖。
使用 location 匹配后缀并添加 header
在 server 或 location 块中,用正则或后缀匹配目标文件,然后添加强制下载头:
- 推荐用
location ~* \.(zip|pdf|exe|apk|tar\.gz)$进行大小写不敏感匹配 - 内部必须包含
add_header Content-Disposition "attachment"; - 建议加上
add_header X-Content-Type-Options "nosniff";防止 MIME 类型嗅探绕过
注意 add_header 的继承与覆盖规则
add_header 不会自动继承父块,且同级多个 location 中重复定义会导致仅最后一个生效。常见陷阱:
- 如果根 location 有
add_header Content-Type ...,它不会影响子 location - 若用了
try_files或alias,确保匹配逻辑仍进入该 location 块 - 避免在 if 块中使用 add_header(Nginx 官方不推荐,行为不可靠)
配合 static 文件服务完整示例
假设静态文件放在 /var/www/files/,希望所有 .zip 和 .pdf 强制下载:
location /files/ {
alias /var/www/files/;
# 允许目录列表(可选)
autoindex on;
}
<p>location ~<em> ^/files/.</em>.(zip|pdf|exe)$ {
alias /var/www/files/;
add_header Content-Disposition "attachment";
add_header X-Content-Type-Options "nosniff";</p><h1>可选:禁用缓存以避免旧响应头被复用</h1><pre class='brush:php;toolbar:false;'>add_header Cache-Control "no-store";}
注意:alias 路径末尾需与 location 路径语义对齐;若用 root,路径拼接逻辑不同,需相应调整。
验证是否生效
部署后用 curl 检查响应头:
curl -I https://yoursite.com/files/report.pdf- 确认输出中包含
Content-Disposition: attachment - 同时检查
Content-Type是否合理(如application/pdf),Nginx 通常能自动识别 - 若未生效,检查 error.log 中是否有 “header already sent” 类警告,说明其他模块提前输出了响应


















