配置防盗链
盗链的定义
此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。
为什么会产生盗链
一般浏览有一个重要的现象就是一个完整的页面并不是一次全部传送到客户端的。如果请求的是一个带有许多图片和其它信息的页面,那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的浏览器对这段文本的解释执行,发现其中还有图片,那么客户端的浏览器会再发送一条Http请求,当这个请求被处理后那么这个图片文件会被传送到客户端,然后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面也许要经过发送多条Http请求才能够被完整的显示。基于这样的机制,就会产生一个问题,那就是盗链问题:就是一个网站中如果没有起页面中所说的信息,例如图片信息,那么它完全可以将这个图片的连接到别的网站。这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现,这样显然,对于那个被利用了资源的网站是不公平的。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。
如何实现防盗链
通过限制referer来实现防盗链的功能
配置方式
将虚拟主机1111.com
的配置修改为如下的内容
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/1111.com"
ServerName 1111.com
ServerAlias www.example.com
# <Directory /data/wwwroot/1111.com>
# <FilesMatch 123.php>
# AllowOverride AuthConfig
# AuthName "1111.com user auth"
# AuthType Basic
# AuthUserFile /data/.htpasswd
# require valid-user
# </FilesMatch>
# </Directory>
# <IfModule mod_rewrite.c>
# RewriteEngine on
# RewriteCond %{HTTP_HOST} !^1111.com$
# RewriteRule ^/(.*)$ http://1111.com/$1 [R=301,L]
# </IfModule>
//新增如下段配置
<Directory /data/wwwroot/1111.com>
SetEnvIfNoCase Referer "http://1111.com" local_ref
SetEnvIfNoCase Referer "http://aaa.com" local_ref
#SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Require all denied
Require env local_ref
</filesmatch>
</Directory>
ErrorLog "logs/1111.com-error_log"
CustomLog "logs/1111.com-access_log" common
</VirtualHost>
注:apache 2.4版本以下的配置格式:
Order Allow,Deny
Allow from env=local_ref
- 配置说明
<Directory /data/wwwroot/1111.com> //定义需要配置防盗链的目录
SetEnvIfNoCase Referer "http://1111.com" local_ref //定义白名单为http://1111.com
SetEnvIfNoCase Referer "http://aaa.com" local_ref //定义白名单为http://aaa.com
#SetEnvIfNoCase Referer "^$" local_ref //定义白名单#为空,此时先注释掉
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)"> //定义哪些格式的资源需要防盗链
Require all denied //首先拒绝所有访问这些资源的请求
Require env local_ref //然后允许有定义过的referer的访问请求
</filesmatch>
</Directory>
//SetEnvIfNoCase 当满足某个条件时,为变量赋值,即根据客户端请求属性设置环境变量。
注:Referer :是指请求当前资源的原始连接,使用referer是可以防盗链
注: 当我们直接在浏览器地址栏输入一个连接进行访问请求时,其referer为空 ,
curl直接请求一个连接referer也是空的 , curl可以通过-e选项来指定referer测试效果
重载配置文件
# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful
测试
# touch /data/wwwroot/1111.com/test.jpg