判断一个请求的Referer可以有效的防止盗链,使用nginx相应的HTTP Referer模块(HTTP Referer)可以实现此功能。
当一个请求头的Referer字段中包含一些非正确的字段,这个模块可以禁止这个请求访问站点。
这个头可以随意的伪造,因此,使用这个模块并不能100%的阻止这些请求,绝大多数拒绝的请求来自一些典型的浏览器,可以认为这些典型的浏览器并不能提供一个”Referer”头,甚至是那些正确的请求。
例如:
valid_referers none blocked www.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
}
}
这个指令在referer头的基础上为 $invalid_referer 变量赋值,其值为0或1。
可以使用这个指令来实现防盗链功能,如果valid_referers列表中没有Referer头的值,$invalid_referer将被设置为1(参照前例)。
参数可以使用如下形式:
none意为不存在的Referer头
blocked意为根据防火墙伪装Referer头,如:“Referer: XXXXXXX”。
server_names为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符。
本文介绍一个nginx第三方模块nginx_substitutions_filter,此模块作用是替换过滤响应主体。
nginx也有一个类似这样的原生模块,但其缺点是:只能使用一条规则,而nginx_substitutions_filter则不限规则数量。
安装方法
1.cd /tmp
2.yum install subversion
3.svn checkout http://substitutions4nginx.googlecode.com/svn/trunk/ substitutions4nginx-read-only
在编译nginx时加上:
./configure --add-module=/tmp/substitutions4nginx-read-only
使用方法
有两条指令:subs_filter_types,subs_filter
subs_filter_types
语法: subs_filter_types mime-type [mime-types]
默认:subs_filter_types text/html
适用区域:http, server, location
subs_filter_types是用来指令需要替换的文件类型,默认是text/html类型。此模块无法处理经过压缩的内容,虽然能与gzip filter模块兼容,但无法处理反向代理返回的内容。
当需要处理反向代理的内容时,可以使用如下语句禁用压缩:
proxy_set_header Accept-Encoding "";
subs_filter
语法;subs_filter 源字段串 目标字段串 [gior]
默认:无
适用区域:http, server, location
subs_filter指令允许在nginx响应输出内容时替换源字段串(正则或固定)为目标字符串。第三个标志含意如下:
g(默认): 替换所有匹配的字段串。
i: 执行区分大小写的匹配。
o: 仅替换首个匹配字符串。
r: 使用正则替换模式,默认是固定模式。
模块官网:http://code.google.com/p/substitutions4nginx/
设置方法如下:
1、根据文件http://www./2011/12/nginx-http-auth-basic/后面的部分生成密码文件,放在/usr/local/nginx/conf。
2、在nginx.conf文件中加入:
location ~ .*.(php|php5)?$
{
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fcgi.conf;
}
auth_basic "Restricted";
auth_basic_user_file htpasswd;
}