在实际生产过程中,我们线上的图片等静态资源,经常会被其他网站盗用,他们发大财的同时,成本确实我们在买单,下面来说下,如何杜绝这种行为。
应该说只要是静态资源都是可以防盗链的,只需要在Server字段加上几行代码即可。众所周知网站出名了后,会有各种刁民来找茬的,最常见的就是爬你网站的东西。
关于防盗链这里不得不提一下网页的加载顺序是先加载HTML相关的内容,然后解析HTML的内容,那些需要加载图片,那些需要加载文件,是逐步加载的,所以可以在加载静态资源的时候做防盗链的操作,例如:在加载图片的时候直接跳转去其他链接,或者直接返回404,403等错误代码,拒绝它的请求。
HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况.
比如在www.google.com 里有一个 www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=http://www.google.com
HTTP 协议中有一个用来表示“页面或资源”来源的“请求头”,这个请求头叫做 Referer --> Referer是表示请求是从哪个网址发出的
防盗链功能基于HTTP协议支持的 Referer 机制,通过Referer跟踪来源,对来源进行识别和判断
为了模拟盗链,在这里让101为网站服务站点,102为网关服务器,103访问101进行盗链。
修改 102 Nginx 配置文件:
此时在浏览器输入102ip,可以正常访问101站点。
如果不想被盗链,则对101站点服务修改Nginx配置文件,防盗链的配置可以在任意的 location 模块下设置,不能在 server 下,你不想让别人盗链哪个资源就在那个资源的 location 模块下设置防盗链:
测试效果,用102ip去访问,css等静态资源返回403,获取不到:
1.# 格式:
valid_referers none | blocked | server_names | strings ....;
--none:允许没有http_refer的请求访问资源,检测 Referer 头域不存在的情况,则可以访问。
--blocked:检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以
“http://” 或 “https://” 开头。允许不是http://开头的,不带协议的请求访问资源。
--server_names :只允许指定ip/域名来的请求访问资源(白名单)。可设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。在生产环境中尽量使用域名,不使用ip。
2.# 举例
valid_referers 192.168.44.101;
if ($invalid_referer) {
return 403;
}
1.# 安装 curl 命令
yum -y install curl
2.# 测试,在 103 机器中访问 101
curl -I http://192.168.44.101/img/logo.png
-I:不带 Referer ,只是给我们返回响应的一些头信息。
curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png
-e:"http://baidu.com" 为 Referer,返回响应的一些头信息
在 101 Nginx 中 创建一个 401文件:
vim /usr/local/nginx/html/401.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Error</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>非法请求</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>
修改 101 配置文件,在下面添加一个 error_page 模块:
测试效果,在浏览器输入 102ip 访问站点的图片,返回下面信息:
在 101 站点服务器中 创建 img 目录 /usr/local/nginx/html/img ,往里面 添加一张图片 x.png,修改配置文件:
在浏览器输入 102ip 访问到101 网址页面,图片位置上显示 x.png :