Nginx如何拼接多个valid_referers配置 验证自定义写法有效性
Nginx
valid_referers 多域名配置问题 初始配置参考
我正在尝试厘清如何拼接多个valid_referers配置规则,初始配置示例如下:
location ~* \.(gif|otf|jpg|jpeg|png|css|js)$ { # 在此处添加多个可信域名 valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; } }
疑问
如下自定义写法可以正常生效吗?
location ~* \.(gif|otf|jpg|jpeg|png|css|js)$ { valid_referers none blocked ~\.notblock-one.com\.notblock-two.com ~\.notblock-three.com\. ~\.notblock-etc.com\.; if ($invalid_referer) { return 403; } }
解答
你写的这个自定义写法完全无法正常生效,存在两个核心错误:
valid_referers的多条规则是按空格拆分识别的,你把notblock-one.com和notblock-two.com写在同一个~开头的正则表达式里,Nginx会把这整串当成一条独立匹配规则,只会匹配referer中包含.notblock-one.com.notblock-two.com这类连续字符串的请求,根本实现不了多个域名加白的需求。- 正则语法错误:你写的正则末尾多了无意义的转义点,比如
~\.notblock-three.com\.末尾的\.,会要求匹配内容的末尾必须带一个半角点,正常合法的请求referer不会符合这个格式,会导致大量合法请求被误拦截。
正确配置方法
不管是固定域名、泛域名还是正则匹配的域名,每个规则单独书写,用空格分隔即可;如果是正则规则,每个正则前单独加~标记,不要把多个域名揉进同一个正则里:
location ~* \.(gif|otf|jpg|jpeg|png|css|js)$ { valid_referers none blocked # 逐个列出需要加白的域名、泛域名 notblock-one.com *.notblock-one.com notblock-two.com *.notblock-two.com notblock-three.com *.notblock-three.com notblock-etc.com *.notblock-etc.com; if ($invalid_referer) { return 403; } }
如果需要用正则做复杂匹配,要保证每个正则语法正确、独立成项:
# 正则匹配示例,每条正则单独以~开头 valid_referers none blocked ~^https?://([a-z0-9-]+\.)?notblock-one\.com$ ~^https?://([a-z0-9-]+\.)?notblock-two\.com$;
注意:
valid_referers中的正则默认是子串匹配,如果要做精确域名匹配,必须手动加^(行首)、$(行尾)锚定符号,否则只要referer中包含对应字符串就会被判定为合法,存在防盗链被绕过的风险。
内容的提问来源于stack exchange,提问作者btgen
相关产品推荐
相关产品推荐

