Nginx referer 模块,筑起防盗链高墙,告别流量盗刷
|
admin
2025年10月24日 22:18
本文热度 20
|
使用 referer 模块实现网站资源防盗链
在某网站通过 URL 引用其他网站的静态资源,动态资源,当用户在浏览器中浏览或点击请求 URL 时,会在请求头部中带上 Referer 字段,用以标识当前请求是从哪个页面链接过来的。若不加以限制,则容易被盗刷流量,增加服务器资源消耗,所以我们需要一个拒绝非正常的网站访问我们站点资源的策略,即防盗链。
在 Nginx 中,可通过 referer 模块来实现网站资源防盗链,其原理是使用 invalid_referers 变量根据配置判断 referer 值是否合法,若不合法则返回 403 状态码;值得注意的是 referer 模块已默认编译进 Nginx 中,可通过 --without-http_referer_module 参数禁用。
特别注意:在实际使用中,还需注意 Referer 字段可以被客户端伪造,所以还需结合其他安全措施一起使用,例如 IP 地址白名单、签名验证,或者下一章节讲解的 secure_link 模块等。
温馨提示:若文章代码块中存在乱码,请通过文末的阅读原文链接,在知识星球中阅读,或者直接访问原文链接:https://articles.zsxq.com/id_rx229kjix356.html
模块指令
# 指定“Referer”请求标头字段值,这些值将导致嵌入的 $invalid_referer 变量设置为空字符串。
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
# 参数说明:
none: 请求报头中缺少 “Referer” 字段;
blocked: 请求报头中的 “Referer” 字段被防火墙或代理服务器替换,此类值是不以 "http://" 或 "https://" 开头的字符串;
server_names: 请求报头中的 “Referer” 字段与服务器名称匹配,支持通配符以及正则表达式匹配;
# 设置有效的referers哈希表设置存储桶大小
Syntax: referer_hash_bucket_size size;
Default: referer_hash_bucket_size 64;
Context: server, location
# 设置有效引用者哈希表的最大大小
Syntax: referer_hash_max_size size;
Default: referer_hash_max_size 2048;
Context: server, location
示例演示
例如,只允许来自 www.weiyigeek.top 及 blog.weiyigeek.top/test 路径 和其wygk.eu.org子域名请求访问资源,缺少 referer 头或者其他来源的请求将被拒绝。
location /referer {
valid_referers server_names www.weiyigeek.top blog.weiyigeek.top/test *.wygk.eu.org;
if ($invalid_referer) {
return 403;
}
return 200 'valid referers, http_referer: $http_referer';
}
使用 curl 命令测试不同 Referer 头请求的结果:
# 缺少 referer 头,返回 403 状态码
curl http://test.weiyigeek.top/referer
# 存在 referer 头,但是不以 "http://" 或 "https://" 开头的字符串,返回 403 状态码
curl -H "Referer: www.weiyigeek.top" http://test.weiyigeek.top/referer
# 有效 referer 头,返回 200 状态码
curl -H "Referer: http://www.weiyigeek.top" http://test.weiyigeek.top/referer
# 存在 referer 头,但不是来自指定域名路径的请求,返回 403 状态码
curl -H "Referer: http://blog.weiyigeek.top/01test" http://test.weiyigeek.top/referer
# 特别注意:由于是字符串匹配,所以此处路径/test01与/test 由于前缀是匹配的,返回 200 状态码
curl -H "Referer: http://blog.weiyigeek.top/test01" http://test.weiyigeek.top/referer
# 存在 referer 头,任意 wygk.eu.org 子域名路径的请求,都将返回 200 状态码
curl -H "Referer: http://t1.wygk.eu.org" http://test.weiyigeek.top/referer
curl -H "Referer: http://t2.wygk.eu.org" http://test.weiyigeek.top/referer
参考文档:https://nginx.org/en/docs/http/ngx_http_referer_module.html
阅读原文:原文链接
该文章在 2025/10/29 18:56:59 编辑过