nginx: http_referer_module
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
- 请求头部有“Referer”字段,但是它的值被防火墙或代理服务器删除了。
- 不以“http://”或“https://”开头的那些值。
- server_names
包含服务器名(server names)之一。
- 任意字符串(arbitrary string)
定义一个服务器名字加上一个可选的URI前缀。服务器名字之前或之后可以有一个可选的通配符(*)。在执行检查期间:“Referer”中的端口号将被忽略。
- 正则表达式
PCRE正则表达式,最前面再加一个“~”。将只比较“http://”或“https://”之后的内容。