09 Jan 2015
## 主配文件中确认加载以下两个模块 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)
##虚拟主机配置文件中配置 SetEnvIfNoCase Referer ".*example\.com" local_ref=1 <Filesmatch ".*\.(gif|jpe?g|png|mp4)"> Require env local_ref </Filesmatch>
## 虚拟主机配置文件中配置 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这张图片上去
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变量,所以,只是简单的屏蔽
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;
}
}
上面的配置在官网对比过,语法没有错误,但是用curl -e指定一些乱七八糟的refer来访问论坛png图片时,居然全部可以正常”200 ok”.
百思不得其解后,才发现我在防盗链的配置前面,配置过png图片的缓存和不记录log
尝试把防盗链的配置剪切到图片缓存和关闭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
其实之前曾经就遇到过这个问题,当时也是在vhost的配置文件中先写了php解析,然后又对某个php文件进行auth认证,就是用调换顺序把auth认证写在了php解析的前面才成功了的,所以,nginx和apache配置文件的逻辑,应该与iptables类似,只要满足前面的规则就可以执行了。