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
相关产品推荐
相关产品推荐

