nginx: http_referer_module

陪她去流浪 桃子 2015年04月17日 编辑 阅读次数:3232

ngx_http_referer_module 模块用于阻止那些 HTTP 头中“Referer”字段被判定为“无效”的请求访问站点(简单的防盗链规则)。但是:伪造合法的“Referer”却是很容易的,因此这类“看似合法”的请求并不会被阻止。而浏览器发送的“Referer”总是有效(非人为伪造)的,因此也能够阻止一部分流量的请求。还有一点值得考虑的是:就算请求是有效的,某些常规的浏览器可能也不会发送“Referer”字段。所以:访问限制策略应该是多样的。

示例配置

valid_referers none blocked server_names
               *.example.com example.* www.example.org/galleries/
               ~\.google\.;

if ($invalid_referer) {
    return 403;
}

指令

语法referer_hash_bucket_size size;
默认referer_hash_bucket_size 64;
环境http, location
版本>=1.0.5

设置有效的Referer哈希表的大小(bucket size)。详见:哈希表文档

语法referer_hash_max_size size;
默认referer_hash_max_size 2048;
环境server, location
版本>=1.0.5

设置有效Referer哈希表的最大大小。详见:哈希表文档

语法valid_referers none | blocked | server_names | string ...;
默认 
环境server, location

指定那些将使变量“$invalid_referer”的值为空串的Referer请求字段的值。否则,该变量的值将会是“1”。搜索匹配时不区分大小写。

可以是以下参数(可以是多个):

  • none

    请求头部没有“Referer”字段。

  • blocked
    1. 请求头部有“Referer”字段,但是它的值被防火墙或代理服务器删除了。
    2. 不以“http://”或“https://”开头的那些值。
  • server_names

    包含服务器名(server names)之一。

  • 任意字符串(arbitrary string)

    定义一个服务器名字加上一个可选的URI前缀。服务器名字之前或之后可以有一个可选的通配符(*)。在执行检查期间:“Referer”中的端口号将被忽略。

  • 正则表达式

    PCRE正则表达式,最前面再加一个“~”。将只比较“http://”或“https://”之后的内容。

变量

$invalid_referer
如果有效则为空串,否则为“1”。

标签:nginx