如何禁止用户直接通过URL下载文件,仅允许从指定页面跳转获取
实现方案
方案1:HTTP Referer校验(轻量实现,适合普通场景)
基于浏览器跳转时会自动携带Referer请求头的特性,仅需在服务端配置访问规则即可快速实现。
- 校验逻辑:
- 收到
https://example.com/file.exe这类资源请求时,服务端先读取请求头的Referer字段 - 若
Referer值为https://example.com/getfile.html,直接返回文件资源允许下载 - 若
Referer为空、或来源不是指定页面,直接返回302状态码重定向到https://example.com/getfile.html
- 收到
- Nginx配置示例(直接追加到站点配置文件即可生效):
location ~* \.(exe|zip|rar|pdf)$ { valid_referers https://example.com/getfile.html; if ($invalid_referer) { return 302 https://example.com/getfile.html; } }
- 注意:该方案存在小概率被伪造Referer绕过的可能,适合对安全性要求不高的普通场景,同时需要注意不要在getfile.html页面配置
Referrer-Policy: no-referrer、也不要给下载用的<a>标签加rel="noreferrer"属性,避免Referer头丢失导致正常用户无法下载
方案2:临时Token校验(高安全性,无法轻易绕过)
需要前后端配合实现,原理是下载链接附带短时有效、和用户绑定的校验Token,完全不依赖Referer头,破解难度极高。
- 实现步骤:
- 用户访问
https://example.com/getfile.html时,后端生成一个有效期10分钟、和当前用户会话绑定的临时Token,存入Redis等缓存中,同时将Token注入到页面的下载链接内,最终<a>标签的href属性为https://example.com/file.exe?token=xxxxxxx - 用户点击
<a>标签请求资源时,服务端先校验URL携带的Token是否存在、是否和当前用户会话匹配、是否在有效期内 - 校验通过则返回文件资源,同时可删除该Token实现一次性使用;校验失败直接重定向到
getfile.html
- 用户访问
内容的提问来源于stack exchange,提问作者Baigei
相关产品推荐
相关产品推荐

