Nginx 中 location 块通过路由隔离实现上传与下载安全分离:上传走 /api/file/upload 反向代理至后端,仅允 POST;下载用 alias 映射只读静态目录如 /download/,禁目录浏览与类型嗅探,并封锁上传目录 HTTP 访问。

在 Nginx 中,location 块本身不直接处理文件上传或下载逻辑,但它能精准控制请求的路由、权限和资源访问路径,是实现“上传”与“下载”资源隔离的关键入口。真正的上传由后端(如 Spring Boot、ASP.NET Core)完成,下载则常通过 alias、root 或 X-Accel-Redirect 实现。而 location 的作用,是把这两类行为从 URL 层面彻底分开,避免路径混用、越权访问或静态文件被意外覆盖。
区分上传与下载的 URL 路径设计
核心原则:上传走 API 接口路径,下载走静态资源路径,两者不能共用同一前缀。
- 上传请求应统一走
/api/file/upload这类后端接口,Nginx 只做反向代理,不接触文件内容 - 下载请求应映射到明确的只读静态目录,例如
/download/或/static/,且该路径下禁止执行任何脚本 - 避免使用
/upload/作为下载路径——这容易让人误解为可写,也违背安全常识
用 location 精确限制上传入口
上传动作必须由后端代码控制,Nginx 仅负责拦截非法直传、限制方法、拒绝非 POST 请求:
- 禁止对上传路径发起 GET、PUT、DELETE 等非必要方法:
location ^~ /api/file/upload {<br> limit_except POST { deny all; }<br> proxy_pass http://backend; - 若需前端直传(如 OSS、MinIO 分片上传),应单独配置带鉴权的
location,并配合auth_request模块校验 token - 绝不在上传 location 中配置
alias或root——那会把上传请求误导向静态文件系统,造成严重漏洞
用 location 安全暴露下载资源
下载路径必须是只读、无执行权限、路径不可遍历的静态服务区域:
- 用
alias显式绑定到专用下载目录(推荐):location /download/ {<br> alias /data/files/download/;<br> autoindex off;<br> expires 1h;<br> add_header X-Content-Type-Options nosniff;<br>} - 禁用目录浏览(
autoindex off)、禁用类型嗅探(X-Content-Type-Options)、设置合理缓存 - 若需按业务隔离(如 Web 头像、小程序二维码),可设多个 location:
location /web/avatar/ { alias /data/files/web/avatar/; }<br>location /wx/qrcode/ { alias /data/files/wx/qrcode/; }
防止上传目录被下载或执行
这是隔离中最容易忽略的一环:上传后的文件若落在 Web 可访问路径下,可能被恶意构造 URL 直接下载甚至执行。
- 后端保存上传文件时,**绝对不要**存到 Nginx 的
root或alias目录内(如/var/www/html/upload/) - 应存到 Nginx 无法直接访问的路径,例如
/data/uploads/,再由后端通过流式响应或X-Accel-Redirect控制下载 - 可在 Nginx 中显式封锁上传目录的 HTTP 访问:
location ^~ /data/uploads/ { return 403; }(即使路径不在 server root 下,也防配置失误)










