apache: 配置 - 防盗链



0. 配置加载模块

## 主配文件中确认加载以下两个模块
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so

## 重载配置,查看模块是否加载
# apachectl -M | grep -E "setenvif|rewrite"
 setenvif_module (shared)
 rewrite_module (shared)

1. 配置防盗链

方法1:setenvif方式

##虚拟主机配置文件中配置
SetEnvIfNoCase Referer ".*example\.com" local_ref=1
<Filesmatch ".*\.(gif|jpe?g|png|mp4)">
        Require env local_ref
</Filesmatch>

方法2:rewrite方式

## 虚拟主机配置文件中配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://example.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://example.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.example.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.example.com$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.example.com/about/nolink.png [R,NC]
## 若不是example.com来的访问,则rewrite到nolink.png这张图片上去

2. 扩展

1) apache 2.2的方法1配置

SetEnvIfNoCase Referer ".*example\.com" local_ref=1
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
    Order Allow,Deny
    Allow from env=local_ref
</filesmatch>

## 防盗链原理
分析referer变量值,如果不是信任域名来源,则屏蔽
缺点是,访问时可以修改referer变量,所以,只是简单的屏蔽

3. curl -e参数(指定refer地址),可用来测试防盗链

1) nginx的www.301r.com虚拟域名的配置文件

location ~* ^.+\.(gif|jpe?g|png|bmp|swf|rar|zip|flv|xls|bz2|gz|doc)$
        {
                valid_referers none blocked server_names .\*301r.com;
                if ($invalid_referer)
                {
                        return 403;
                }
        }

2) 错误信息

上面的配置在官网对比过,语法没有错误,但是用curl -e指定一些乱七八糟的refer来访问论坛png图片时,居然全部可以正常”200 ok”.

百思不得其解后,才发现我在防盗链的配置前面,配置过png图片的缓存和不记录log

3) 错误排除

尝试把防盗链的配置剪切到图片缓存和关闭log的前面时,成功解决

curl -I -xlocalhost:80 -e "http://www.302r.com/fdsfds" "http://www.301r.com/static/image/common/logo.png"
HTTP/1.1 403 Forbidden
Server: nginx/1.6.2
Date: Sun, 25 Jan 2015 02:04:55 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive

4) 原因分析:

其实之前曾经就遇到过这个问题,当时也是在vhost的配置文件中先写了php解析,然后又对某个php文件进行auth认证,就是用调换顺序把auth认证写在了php解析的前面才成功了的,所以,nginx和apache配置文件的逻辑,应该与iptables类似,只要满足前面的规则就可以执行了。