如何通过Nginx配置阻止其他网页下载本站服务器上的媒体资源
结论
- 可以通过修改Nginx配置禁止外部站点盗链本站媒体资源,最常用的方案是基于Referer请求头的校验规则
- 也可以通过CORS设置实现该需求,两种方案都可以独立配置,也可以叠加使用提升防护效果
方案1:基于Referer校验的Nginx防盗链配置
这是行业内处理图片盗链最通用的方案,配置成本低,对正常用户访问无影响:
找到你的Nginx站点配置文件(一般存放在/etc/nginx/conf.d/目录下对应站点的.conf文件,或者/etc/nginx/nginx.conf里的server块),在server块中添加如下规则:
# 匹配需要防盗链的资源后缀,可根据需求增删 location ~* \.(gif|jpg|jpeg|png|webp|bmp|mp4|mp3|flv|avi|swf)$ { # 允许的合法域名,localhost是本地调试用,替换为你自己的站点域名即可,多个域名用空格分隔 valid_referers none blocked server_names *.你的域名.com 你的域名.com; # 非法Referer的情况默认返回403,也可以配置返回一张提示盗链的占位图 if ($invalid_referer) { return 403; # 如需返回占位图,用下面两行代替上一行的return 403即可 # rewrite ^/ https://你的域名.com/anti-steal.jpg; # break; } }
参数说明:
none:允许没有Referer头的请求访问(比如用户直接在地址栏输入图片地址打开的场景)blocked:允许Referer头被防火墙/代理修改过、不为空但没有有效值的请求server_names:自动匹配当前server块中配置的所有站点域名,不用手动逐个添加
配置完成后执行nginx -t校验配置是否正确,无误后执行nginx -s reload重载配置即可生效。
方案2:基于CORS规则实现防盗链
CORS是专门用于跨域资源访问控制的机制,也可以实现媒体资源的跨域拦截,注意CORS规则仅对浏览器发起的跨域请求生效,爬虫或者非浏览器场景的请求不会遵守CORS规则,所以防护范围比Referer方案窄,适合作为补充防护。
配置示例如下,同样添加在server块或者对应资源的location块中:
location ~* \.(gif|jpg|jpeg|png|webp|bmp|mp4|mp3|flv|avi|swf)$ { # 允许跨域的域名,替换为你自己的站点域名即可,多个域名可以通过if判断或者map映射配置 if ($http_origin ~* ^https?://(.*\.)?你的域名\.com$) { add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; } # 非允许域名的跨域请求,浏览器会自动拦截加载 add_header Access-Control-Allow-Origin '' always; }
额外说明
- 两种方案可以同时配置,叠加后防护效果更好
- Referer头可以被伪造,如果遇到针对性伪造Referer的盗链,可以配合Cookie校验、签名校验等方案提升防护等级
- 如果你的站点本身需要开放部分图片给其他合作站点引用,直接把合作站点的域名加在
valid_referers的允许列表里即可
内容的提问来源于stack exchange,提问作者andrey_Kox
相关产品推荐
相关产品推荐

