referer 请求头控制模块可以通过设置请求头中的属性字段 Referer 的值控制访问的拒绝与允许。Referer 字段用来表示当前请求的跳转来源,由于该字段可能会涉及隐私权问题,部分浏览器允许用户不发送该属性字段,因此也会存在浏览器正常的请求头中无 Referer 字段的情况。
另外,有些代理服务器或防火墙也会把 Referer 字段过滤掉。通常情况下,伪造 Referer 字段的内容是很容易的,因此该模块主要用于浏览器正常发送请求中 Referer 值的过滤。
虽然通过 Referer 字段进行来源控制并不十分可靠,但用在防盗链的场景中还是基本可以满足需求的。该模块的内置配置指令如下表所示。
指令 | 作用域 | 默认值 | 指令说明 |
---|---|---|---|
referer_hash_max_size | server, location | 2048 | referer 指令中,存储变量的哈希表的大小 |
referer_hash_bucket_size | server, location | 64 | referer 指令中,存储变量的哈希桶的大小 |
valid_referers | server, location | -- | 当用户的 HTTP 头的属性字段 Referer 的值符合指令值的检测时,设置变量 $invalid_referer 为空 |
referer 指令值参数如下表所示。
参数名称 | 参数说明 |
---|---|
none | Referer 的值为空 |
blocked | 代理服务器或防火墙过滤后的 Referer 值,这些值都不以 http:// 或 https:// 开头 |
server_names | Referer 的值中包含一个服务器名 |
配置样例如下:
server{
listen 8080;
server_name nginxtest.org;
root /opt/nginx-web/www;
valid_referers none blocked *.nginxtest.org;
# 当Referer为空或内容不包含“http://”或以“https://”开头的主机名为“*.nginxtest.
# org”时允许访问
if ($invalid_referer) {
return 403;
}
}
指令值为字符串时,既可以是包含前缀或后缀的主机名,也可以是包含主机名的 URI。
指令值为正则表达式时,必须以~开头,Nginx 将从“http://”或“https://”之后的字符串开始匹配。
默认变量 $invalid_referer 的值为 1,当 Referer 的值与指令值的内容匹配时,$invalid_referer 的值为空。