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

Nginx配置指定域名特定页面防盗链的问题

Nginx配置指定域名特定页面防盗链的问题

嗨,我懂你的困扰了——你想只允许来自status.domain3.ext/codepage-100这个特定页面的图片引用,但直接把完整路径加到valid_referers里完全没效果,对吧?

问题出在valid_referers这个指令的工作逻辑上:它只能匹配Referer请求头里的主机名(域名)部分,根本不会识别域名后面的URL路径。你之前写的status.domain3.ext/codepage-100会被它当成一个奇怪的主机名来解析,自然起不到过滤路径的作用。

给你两种可行的解决方案,选哪种看你习惯:

方案一:基于原配置扩展,兼容已有规则

这种方法保留你原来的valid_referers逻辑,只针对domain3的情况额外做路径检查:

location ~ ^/(.*\.(jpe?g|png|gif))$ {
    # 先处理你自己的域名和合法来源
    valid_referers none blocked domain1.ext *.domain2.ext status.domain3.ext;
    
    if ($invalid_referer) {
        # 如果Referer来自status.domain3.ext且是目标路径,就标记为合法
        if ($http_referer ~* ^https?://status\.domain3\.ext/codepage-100) {
            set $invalid_referer "";
        }
        # 非合法来源返回403
        return 403;
    }
}

方案二:完全用正则匹配,更灵活可控

如果需要更精细的控制,直接通过$http_referer变量做正则匹配:

location ~ ^/(.*\.(jpe?g|png|gif))$ {
    # 默认标记为不允许访问
    set $allow_access "0";
    
    # 允许无Referer的请求(比如直接访问图片)
    if ($http_referer = "") {
        set $allow_access "1";
    }
    # 允许来自domain1.ext的所有引用
    if ($http_referer ~* domain1\.ext) {
        set $allow_access "1";
    }
    # 允许来自*.domain2.ext的所有引用
    if ($http_referer ~* \.domain2\.ext) {
        set $allow_access "1";
    }
    # 只允许来自status.domain3.ext/codepage-100的引用
    if ($http_referer ~* ^https?://status\.domain3\.ext/codepage-100) {
        set $allow_access "1";
    }
    
    # 不允许的请求返回403
    if ($allow_access = "0") {
        return 403;
    }
}

最后提醒一句:Referer头是可以被伪造的,这种配置只能挡住普通的盗链行为,没法彻底杜绝恶意的资源盗用哦。

备注:内容来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 10:32:59