最近帮朋友作一数据采集器,将A网站上的数据自动采集到B网站上,在作的过程当中遇到网站的盗链问题。很不幸的出现下列的画面:nginx
很不幸咱们采集数据的网站设置了防盗链机制,遇到问题就要解决,以下,就细细的探讨一下我对这个东东的理解吧:浏览器
一 什么是网站防盗链与反盗链:服务器
首先说一下什么是网站的防盗链:防盗链是一种机制,也能够说是一种技术.目的就是防止本身网站上的东西(如图片,文件 etc。)被其余用户采用其余的技术手段来访问或者下载,这种机制在google,sina,天涯上很广泛,再说为何不让你盗链呢,既然不让盗链确定涉及到一些利益的问题,呵呵,这是我猜测。由于盗链的话就会分散主网站的流量(^_^流量但是不少网站的钱途啊)。那么它是如何实现的呢,或者是怎么才能作到本身网站上的东西不被别人盗链呢,要说这个就有必要说说他的原理。咱们知道在网络上咱们每次发送一个请求的时候都会生成一个http请求,而后服务器会对这个http请求进行解析,那么一个http请求中有什么标志或者说是什么做用来实现防止盗链的做用呢,下面咱们看一个简单的http请求(http的请求和相应后头咱们再说),看看再http请求中有什么是能够用来做为盗链的标志的呢:网络
上图是咱们在请求www.baidu.com的时候在加载显示在百度首页上的图片时发生的http请求和响应,session
咱们看图片中的两个红色的标记处,第一行是请求的图片的地址,第二行是咱们今天要说的Referer :请求图片来源,这里显示的是www.baidu.com,说明这个图片是在百度的图片服务器上下载下来的。那么这里问题就获得解决了,既然能够获得这个图片的来源Referer,服务器就能够经过判断Referer中的值是否是本身网站服务器的域名来判断这个请求是否是别人盗链的,也就是请求没有在本身的网站上发出。利用referer来防止盗链的技术原理就是这样的,咱们在请求的时候浏览器发送到服务器端的时候就会在request中有这个Referer,固然也有人说,我在浏览器输入框中手动的输入图片的下载地址也能够下载啊,是这样的,那这是为何呢?我只能说你遇到的是大部分的网站,可是也有一些防盗链机制很严格的即便你本身手动的在浏览器输入框中输入也不能看到图片,问题就是对大部分的网站在手动输入请求地址的时候Referer是空的(null),服务器就会认为你是手动的在下载图片,这样服务器是不会去拦截的,你很幸运的就能够看到那个妹妹的图片了。学习
上面说的只是防盗链机制中的一种:经过http请求中的Referer来判断,网站
还有以下几种方式也能够实现:1 nginx在处理每个静态的页面请求的时候也能够拦截处理,2 经过用户是否登陆来判断(这里主要是session在起做用)。。。可能还有其余的方式,待我研究研究在和你们交流。google
2 什么是反盗链:url
既然有防盗链的机制,那么对于不少的有哪些需求的淫来讲我得能够搞到我须要的东东啊(固然首先声明啊,这是很不道德的,咱们只是就技术而言来讨论这个问题,很不同意你们去这样作)。这就须要去反盗链,在这里我只针对利用http请求request中的referer的机制来分析一下反盗链机制,对于利用mginx和用户登陆的方式暂时不是很容易实现反盗链。既然在referer中是利用referer中的值来判断请求是不是盗链的,那么咱们就能够利用相应的技术手段来改变这个referer的值来实现。.net
今天就写到这里吧,要去开会了,反盗链的问题咱们下回再细说。。。。。。
好了接着咱的反盗链之路:
上面说过既然有防盗链那么就会有反盗链的技术去破解这个问题,下面就说说如何来解决经过referer来实现的防盗链机制:
对于不一样语言开发者而言去操做这个http中的request的referer这个值得方式是不同的,就好比说servlet来处理这个referer的话就是先获得这个http请求request中的referer,经过一个拦截器的方式去拦截这个请求,而后对这个referer值进行修改,那么如何修改呢,确定是修改成盗链网站的域名。至于这个拦截器怎么去编写你们应该都会,.net在操做这个referer值的时候也是同样的,或者是用一个拦截器去请求,或者是让请求指向特定的请求地址,在特定的请求地址中对这个referer进行包装。好比我想盗链www.aaa.com上的一个图片,这个图片的请求地址是www.aaa.com/image/1,jpg。那么在请求的时候咱们可让请求指向www.ourserver.com/handleRequest.asp?url=www.aaa.com/image/1,jpg中,在这个处理器中对referer进行从新的包装,怎么包装呢,就是讲referer的值制定为www.aaa.com。这样www.aaa.com在接到图片请求地址的时候就会去判断请求中的referer值,这时由于咱们对referer值已经进行了从新的包装,就能够经过www.aaa.com的校验。
甚至其余的几种方式:如经过nginx,和登陆session的方式的反盗链比较麻烦,后续学习学习再和你们探讨吧。
最后声明一点:咱们只是在就技术论技术,并不提倡你们去盗链别人的网站,由于这是不道德的同时也是不合法的。你们在学习的过程当中重要的是技术自己,而不是技术所进行的行为,与你们共勉!!!