nginx 通过 location 块实现上传与下载资源隔离:上传走 /api/file/upload 反向代理且仅允 post,禁用 alias/root;下载用 alias 映射只读静态目录(如 /download/),禁目录浏览与类型嗅探,并封锁上传路径 http 访问。

Nginx 本身不处理上传逻辑,也不直接提供下载服务,但通过 location 块的精准路由控制,可以彻底隔离上传与下载两类行为——让上传只走后端 API、下载只读静态文件,从路径层就切断越权可能。
上传必须走 API 接口,且仅限 POST
- 上传请求应统一落在
/api/file/upload这类明确的接口路径下,Nginx 只做反向代理,不接触文件内容 - 在对应
location中禁用非 POST 方法,防止恶意构造 GET/PUT 请求绕过校验
location ^~ /api/file/upload {
limit_except POST { deny all; }
proxy_pass http://backend;
}
- 切勿在该 location 中配置
root或alias,否则请求会被误导向磁盘目录,造成文件覆盖或路径穿越漏洞 - 若需前端直传(如对接 MinIO),应单独配置带鉴权的 location,并启用
auth_request模块校验 token
下载必须映射到只读静态目录,且路径不可遍历
- 下载路径应使用
alias显式绑定到专用目录(如/data/files/download/),避免root引发的路径拼接风险 - 禁用目录浏览、禁用 MIME 类型嗅探、设置合理缓存头
location /download/ {
alias /data/files/download/;
autoindex off;
add_header X-Content-Type-Options nosniff;
expires 1h;
}
- 支持按业务细分:
/web/avatar/、/wx/qrcode/各自映射不同子目录,权限和缓存策略可独立控制 - 所有下载路径都应确保底层文件系统对该目录仅有读取权限,无执行、无写入
严防上传目录被意外暴露为下载入口
- 上传后的文件若落在 Web 可访问路径(如
/var/www/upload/),攻击者可能通过构造 URL 直接下载甚至执行脚本 - 正确做法是:上传目录完全不在任何
location的root/alias范围内;或显式封锁该路径的 HTTP 访问
location ^~ /upload/ {
deny all;
}
- 更稳妥的方式是将上传目录放在 Nginx 根目录之外(如
/data/uploads/),从文件系统层面杜绝 Web 访问可能
差异化上传限制要靠 client_max_body_size 分级配置
- 在
http或server块设兜底值(如1m),防止未配置 location 意外接受超大请求 - 在上传接口 location 内提高限制(如
100m),同时确保后端服务(Spring Boot、Django 等)也同步配置对应限制,否则 Nginx 放行后仍会被后端拒绝
location /api/upload/ {
client_max_body_size 100m;
proxy_pass http://backend;
}
- 避免对下载路径(如
/download/)设置client_max_body_size 0,那会禁用限制但无实际意义,反而增加风险
不复杂但容易忽略。










