一 配置防盗链
首先来了解一下什么是盗链,全称是盗取链接,假如我们的网站有很多好看的图片,别人可以查看我们网站图片的链接,然后应用在他的网站上,这样的话,去访问他的网站,实际上消耗的是我们的流量(因为实际链接在我们这里),这样我们就不得不去配置防盗链,使得别人不能复制我们图片的链接。
1、编辑虚拟主机配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhost.conf
在文件中加入以下内容:
<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://www.111.com" local_ref
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow.Deny
Allow from env=local_ref
</filesmatch>
</Directory>
其中 SetEnvIfNoCase Referer的三行内容是设置白名单
txt|doc|mp3|zip|rar|jpg|gif|png 表示防盗链防盗的对象,设置后,这些类型的文件就不能被白名单外的第三方引用
Order用于定义顺序,是先允许还是先拒绝
2、验证
首先将配置文件中的空referer一行隐藏
然后开启apache服务
# /usr/loacl/apache2.4/bin/apachectl -t
# /usr/local/apache2.4/bin/apachectl start
这时我们在浏览器输入111.com/hw.jpg来访问服务器上hw.jpg这张图片时,出现如下提示
但是如果在白名单的网站上我们发一个帖子,在帖子中加入111.com/hw.jpg这个链接,通过帖子链接跳转又能正常访问
现在我们将配置文件中的空referer一行的#号去掉,重新加载配置文件后,我们再在浏览器输入111.com/hw.jpg来访问服务器上hw.jpg这张图片时,就能正常访问了
以上实验可以看出:"^$"空的referer指的是从浏览器输入图片地址直接访问,没有跳转链接,
我们再来通过curl做实验,当前空referer行未被隐藏
先直接访问,空referer状态,结果访问成功:
再来模拟一个不在白名单中的referer访问图片,结果被拒绝访问:
二 访问控制Directory
只允许白名单内的IP访问指定的目录
1、修改配置文件
配置文件中加入以下内容:
<Directory /data/wwwroot/111.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
以上Order用于定义顺序,是先执行deny还是先执行allow,如果Order后先是allow那么就会先执行allow的语句,如果先是deny,就会先执行deny的语句,它有一个特点是:无论是否匹配到指定的IP,都会从头至尾将语句执行完;admin/为指定的访问控制的目录
创建访问控制目录及子文件
2、重新加载配置文件
# /usr/local/apache2.4/bin/apachectl -t
# /usr/local/apache2.4/bin/apachectl graceful
3、测试访问控制
# curl -x127.0.0.1:80 111.com/admin/index.php -I //此处指定了目标IP,未指定源IP,默认源访问IP同目标IP一致;源IP在配置文件的白名单内,访问200 OK
# curl -x192.168.31.157:80 111.com/admin/index.php -I //此处指定了目标IP,未指定源IP,默认源访问IP同目标IP一致,源IP不在配置文件的白名单内,访问403 Forbidden
我们来查看访问日志记录
# tail /usr/local/apache2.4/logs/111.com-access_log
再来测试通过物理机访问虚拟机
在浏览器输入111.com/admin/index.com结果也提示被禁止访问
三 访问控制FilesMatch
只有指定的IP才能访问匹配的文件或者说是链接
1、编辑配置文件
在配置文件中加入以下内容
<Directory /data/wwwroot/111.com/>
<filesmatch admin.php(.*)>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</filesmatch>
</Directory>
以上表示匹配admin.php(.*)文件或链接只有指定的IP能访问
2、重新加载配置文件
# /usr/local/apache2.4/bin/apachectl -t
# /usr/local/apache2.4/bin/apachectl graceful
3、测试验证
# curl -x192.168.31.157:80 111.com/sfdfsfs -I //以下结果表示找不到这个页面
# curl -x192.168.31.157:80 111.com/admin.php?sfdfsfs -I //以下结果表示不允许源IP访问
# curl -x127.0.0.1:80 111.com/admin.php?dfdfdfdfdfd -I //以下结果表示已经允许的源IP的访问,只是找不到对应的页面
推荐链接
几种限制ip的方法 http://ask.apelearn.com/question/6519
apache 自定义header http://ask.apelearn.com/question/830
apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556