基于nginx的 valid_referer变量可以实现这一功能。
referer是http协议request header中的一个字段,这个字段可以简单的理解为“经手人”,当我们访问某个网站时,我们向这个网站的nginx web server发起了请求,请求解析完成后 nginx会将各种资源和源代码返回给客户端并进行渲染,因此,我们访问的网站可以被视为是我们访问这些静态文件的“经手人”。通过对referer进行限制,可以防止第三方对于资源的获取。
以下代码是一个例子:
valid_referers *.example.com;
#定义了合法的referer,二级域名为example.com的所有网站都是合法的referer
if ($invalid_referer) #如果referer不合法,则 invalid_referer为1
{
return 403; #返回403代码 - 无权限访问
}
alias /www/wordpress/resources/image/;
使用这种方法,所有非指定的referer的访问都会被拒绝,因此,如果用户只是想保存一张图片,仍会收到403错误代码;
下面是另一种方法:
valid_referers none blocked *.example.com; #当referer为空或referer为指定的二级域名时, invalid_referer为0
referer if ($invalid_referer) { #如果referer不合法,则 invalid_referer为1
return 403; #返回403代码 - 无权限访问
}
alias /www/wordpress/resources/image/;
none表示空的referer,也就是直接访问,比如直接在浏览器打开一个文件;
blocked表示被防火墙标记过的来路,*.com表示所有子域名。
然而这种方法又存在另外一个缺陷,那就是由于空referer被视为合法,第三方可以通过隐藏referer来实现对资源的盗取。
综上所述,这两种方法都存在缺陷,最好的方法还是通过设置CDN来限制IP来源。
但是既然你已经用了这种方法了,说明你的网站大概率不是什么热门站点。。大概率不会受到那么多资源窃取,因此也不必太过担心。