internal指令使location仅响应内部重定向,外部直接访问返回404,实现路径隐藏;配合rewrite跳转至internal location及alias映射,可安全提供带校验的临时下载链接。

理解 internal 指令的核心作用
internal 指令让某个 location 只能被 Nginx 内部重定向访问,外部用户直接请求会返回 404。这是实现“隐藏真实资源路径”的关键机制——它不靠密码或 Referer,而是靠访问入口的不可达性来保障安全。
比如你有一份报表文件存放在 /data/reports/20240515_sales.pdf,你不希望用户拼出路径就下载,而是只允许通过带签名的临时链接(如 /download?token=abc123&expires=1715817600)触发一次性的内部跳转。
用 rewrite 实现带校验的临时跳转
在 server 块中配置一个公开的 download 接口,用 rewrite + return 实现逻辑判断与内部重定向:
- 先用 map 或 if 提取 token、expires 参数,并校验签名与过期时间(建议用 Lua 或 auth_request 模块做复杂校验,Nginx 原生 if 仅适合简单场景)
- 校验通过后,用 rewrite 指向一个 internal location,例如:rewrite ^/download$ /_serve/20240515_sales.pdf last;
- 注意:rewrite 后必须是 internal location,且不能带协议或域名,否则会变成外部重定向,失去保护意义
配置 internal location 映射真实文件
定义一个仅内部可用的 location,将路径映射到实际文件系统,并启用下载优化:
- location ^~ /_serve/ {
- internal;
- alias /data/;
- add_header Content-Disposition "attachment; filename=$args";
- add_header X-Content-Type-Options nosniff;
- }
这里 alias /data/ 表示把 /_serve/20240515_sales.pdf 映射为磁盘路径 /data/20240515_sales.pdf。注意 alias 末尾的斜杠和路径拼接规则,避免目录穿越风险。
增强安全性与实用细节
纯 Nginx 实现有局限,生产环境建议补充以下措施:
- 用 auth_request 指令把鉴权交给后端服务(如 Python/Go 接口),由它返回 200 或 403,Nginx 根据响应决定是否执行 internal 跳转
- 对下载链接加 HMAC 签名,防止 token 被篡改;时间戳需服务端校验,避免客户端伪造 expires
- 限制单个 IP 单位时间请求数(limit_req),防止恶意刷取有效链接
- real_ip 模块配合 CDN 头(如 X-Forwarded-For)确保限流与日志准确
不复杂但容易忽略











