Nginx可通过location配合valid_referers和if实现图片防盗链:1.用后缀匹配定义图片location;2.用valid_referers设置Referer白名单(含none、server_names、域名、正则);3.用$invalid_referer判断并返回403或占位图;4.注意避免if中使用proxy_pass/root,确保协议一致,兼容移动端需放行none。

Nginx 通过 location 配合 valid_referers 和 if 指令,可以有效限制图片等静态资源仅被指定来源站访问,防止被其他网站盗链。
1. 定义防盗链的 location 块
针对常见图片后缀(如 .jpg、.png、.gif 等),用正则或后缀匹配方式单独配置 location:
- 推荐使用后缀匹配,简洁稳定:
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ { - 避免匹配到带参数的动态请求(如 ?v=123),可加
^~或更严格正则,例如:
location ~* ^/static/.*\.(jpg|jpeg|png|gif|webp)$ {
2. 设置合法来源(Referer 白名单)
在 location 块内使用 valid_referers 指令定义允许访问的 Referer:
- 支持域名、通配符、正则;空 Referer(直接访问)通常也应允许:
valid_referers none server_names *.example.com example.org ~\.google\.; -
none:允许无 Referer 请求(比如用户直接输入图片地址)server_names:允许本机配置的 server_name 及其子域*.example.com:匹配所有子域~\.google\.:正则匹配 google.com 及其子域(注意转义点号)
3. 拦截非法 Referer 请求
利用内置变量 $invalid_referer(由 valid_referers 自动设置)做判断:
- 返回 403 禁止访问:
if ($invalid_referer) { return 403; } - 或返回自定义占位图(更友好):
if ($invalid_referer) { rewrite ^/.*\.(jpg|jpeg|png|gif)$ /img/forbidden.png break; }
需确保/img/forbidden.png本身不触发防盗链(建议放在另一个不校验 referer 的 location 中,或用valid_referers none;单独放行)
4. 注意事项与优化建议
防盗链配置看似简单,但容易踩坑:
- 不要在 if 中使用 proxy_pass 或 root:Nginx 官方明确不推荐在 if 块中写复杂指令,rewrite + break 是安全做法
- HTTPS 页面引用 HTTP 图片会丢失 Referer:确保协议一致,或在页面中设置
<meta referrer="no-referrer-when-downgrade"> - 移动端 App、微信内嵌页可能不带 Referer:若需兼容,白名单中加入
none,或结合 UA + IP 做辅助识别(非纯 referer 方案) - 测试时用 curl 模拟 Referer:
curl -H "Referer: https://bad-site.com" https://your-site.com/logo.png


















