# 配置例子
server { listen 80; server_name www.rootop.org; root /home/web/www.rootop.org; location ~ .*\.(jpg|png|js|css)$ { valid_referers none blocked server_names rootop.org; if ($invalid_referer) { return 404; } proxy_pass http://127.0.0.1:8080; } location / { proxy_pass http://127.0.0.1:8080; } }
# 注意在防盗链的location中也要加一句proxy_pass,否则图片会从本地找,肯定会返回404状态码。
location ~ .*\.(jpg|png|js|css)$ { valid_referers none blocked server_names rootop.org; if ($invalid_referer) { return 404; } proxy_pass http://127.0.0.1:8080; }
如果不加proxy_pass,在return 404这个地方很容易扰乱排错思路,以为是防盗链返回的404,实际是从本地找不到文件才返回的404.
# 防盗链参数解释
valid_referers 定义一个防盗链白名单 none 表示http请求头中没有Referer这个头信息 blocked 表示http请求头中虽然有Referer头信息,但是中间被防火墙或者被代理服务器删除。 server_names 表示设置的server_name rootop.org 表示允许的Referer,支持通配符,也支持正则
符合以上条件的,nginx会将$invalid_referer这个内置变量的值设置为空字符串。
不符合的,也就是说Referer头信息不符合以上条件,比如 baidu.com,则会将$invalid_referer变量设置为1
这样通过if条件判断进行返回状态码,或者重定向到其他页面,比如一张图片。
参考官方文档:http://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers
原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/4646.html