You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:54:27