Apache 实现资源防盗

Nginx/Web服务器
576
0
0
2022-09-09
标签   apache

一、什么是防盗链?

有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。

举个例子:比如你搭了个discuz论坛,里面有些热点图片、视频;然后别人将他网站上访问图片的地址重定向到你的discuz上,这样他的服务器就可以空闲出来了;也就是说别人访问他网站的图片视频,消耗的确是你服务器的资源;

盗链是指在自己的页面上展示一些并不在自己服务器上的内容。通常的做法是通过技术手段获得它人服务器上的资源地址,

绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。

比较常见的是一些小站盗用大站的资源(图片、音乐、视频),

对于这些小站来说,通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。

对大站造成的影响确实徒徒增加了服务器压力,用户、流量还不是自己的。

二、如何防止盗链

针对Apache进行盗链配置

模拟三个虚拟域名,分别到两个不同的站点中去

image

a域名下有一张图片

image

b域名进行盗链

image

在未配置防盗链之前,b站点的这个图片是能够加载到b站点的,实质上耗费的流量是a站点的

现在开始对a站点做防盗链配置

两种方式

第一种方式在虚拟主机的配置文件中加入如下代码:

image

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://a.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://a.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.a.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.a.com$ [NC]
RewriteRule .*\.(gif|jpg|swf|png)$ http://www.c.com/error1.jpg [R,NC]

注:相关选项的解释

1.RewriteEngineOn #启用rewrite,要想rewrite起作用,必须要写上

2.%{HTTP_REFERER}:服务器变量,HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

3.[ NC]指的是不区分大小写,[R]强制重定向 redirect

4.字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则

注:相关配置的解释

1.RewriteCond %{HTTP_REFERER}!^$ 上面这一行意在允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。

2.RewriteCond %{HTTP_REFERER} !benet.com/.*$[NC]

RewriteCond %{HTTP_REFERER} !www.benet.com/.*$ [NC]

设置允许访问的HTTP来源,包括网站自身。

3.RewriteRule .*.(gif|jpg|swf)$http://www.benet.com/about/p_w_picpath.png[R,NC,L]

定义被盗链时替代的图片,让所有盗链 jpg、gif、swf 等文件的网页,显示网页文档根目录下的about/ p_w_picpath.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即 可:RewriteRule.*.(gif|jpg|png)$ - [F]

注:[F] (强制URL为被禁止的 forbidden),强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。

此时访问a站点,图片正常显示,b站点则显示的是禁止防盗链的提示图片

b站点显示结果

image

a站点显示结果

image

注意:在测试的时候由于浏览器只对同一张图片加载一次,也就是说第一次出来后浏览器就直接记录住了,所以在测试的时候先刷新盗链站点查看最新结果,在刷新本站点查看结果即可,或者使用两个不同的浏览器进行测试则无需考虑缓存问题