nginx 防盗链需在对应静态资源 location 块中配置,优先用 ^~ /static/ 匹配路径,再通过 if 判断图片后缀并校验 referer,白名单须包含所有合法域名,配置后需 reload 并实测验证。

Python 应用(如 Django、Flask)通常不直接处理静态资源,而是交由 Nginx 托管。防盗链配置不在 Python 代码里写,而是在 Nginx 的 server 块中针对静态文件路径或后缀做 location 精准匹配,确保只拦截图片等目标资源,不干扰 API 或模板请求。
明确静态资源托管方式
Python 项目上线时,常见两种静态资源部署模式:
-
独立静态目录:如
/static/或/media/,Nginx 用alias或root指向本地路径(例如/var/www/myapp/static) -
统一前缀路由:所有静态请求走
/static/xxx.jpg,Nginx 用location ^~ /static/拦截
无论哪种,防盗链规则必须放在对应 location 块内,不能写在 location / 或 Python 的反向代理块(如 location /api/)里,否则会误拦接口请求。
只对图片等目标后缀启用防盗链
推荐用正则匹配后缀,聚焦保护对象,避免波及 JS/CSS/字体等跨域常为空 Referer 的资源:
location ~* \.(jpg|jpeg|png|gif|webp|bmp|svg)$ {
valid_referers none blocked *.example.com example.com;
if ($invalid_referer) {
return 403;
}
}
说明:
-
~*不区分大小写,覆盖.JPG、.Png等变体 -
none允许用户直接输入 URL 访问(书签、F5 刷新) -
blocked覆盖 HTTPS→HTTP 跳转、微信内嵌页、某些代理导致 Referer 清空的情况 - 域名白名单要写全:
example.com和www.example.com是不同字符串;CDN 域名(如cdn.example.com)也需单独加
若静态资源走 /static/ 路径,优先用前缀匹配
当所有静态文件都放在 /static/ 下(Django 默认),用 ^~ 匹配更高效且语义清晰:
location ^~ /static/ {
# 先检查是否为图片后缀,再校验 Referer
if ($request_uri ~* \.(jpg|jpeg|png|gif|webp|bmp|svg)$) {
valid_referers none blocked *.example.com example.com;
if ($invalid_referer) {
return 403;
}
}
alias /var/www/myapp/static/;
expires 1y;
add_header Cache-Control "public, immutable";
}
注意:
-
if嵌套在location内是安全的,Nginx 允许这种条件判断 -
alias必须存在,否则文件找不到,防盗链也就失去意义 -
expires和缓存头建议加上,减少重复请求
测试与验证要点
配置后务必 reload 并实测,避免线上误拦:
- 本地直连:curl http://example.com/static/logo.png → 应返回 200
- 模拟盗链:curl -e "https://evil-site.com" http://example.com/static/photo.jpg → 应返回 403
- 微信内访问:用手机微信打开页面,确认图片正常加载(依赖
blocked) - 检查日志:加
log_format记录$invalid_referer和$http_referer,便于排查漏放或误拦
不复杂但容易忽略细节。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











