小皮面板防盗链设置后静态资源无法访问怎么办
按这篇做完,你能让被防盗链误伤的 CSS、JS、图片重新正常加载,同时保留防盗链效果。
第一步:先确认 403 确实是防盗链造成的
这一步要拿到明确证据,避免把问题错怪到防盗链头上。打开浏览器无痕窗口,按 F12 打开开发者工具,切到 Network 面板,刷新页面,找到报错的静态资源(状态码一般是 403,也可能是 302 跳到某张占位图),点开它看 Request Headers 里的 Referer 值,以及 Response Headers 里有没有 server: nginx。
再用命令行做对比测试,两条命令只有 Referer 不一样:
curl -I https://www.example.com/static/style.css
curl -I -H "Referer: https://www.other.com/" https://www.example.com/static/style.css
如果第一条 200、第二条 403,说明防盗链生效且规则正常,问题出在白名单没覆盖自己的域名;如果两条都 403,说明白名单几乎没配对,或者空 Referer 被拦了。
注意:不带 Referer 的请求(地址栏直接打开、APP 内嵌 WebView、小程序、iOS Safari 隐私模式)非常常见,它们全都算「空 Referer」,必须显式放行。
第二步:在面板里找到防盗链配置入口
这一步要看到当前的白名单到底写了什么。登录小皮面板,左侧菜单点「网站」,在站点列表里找到目标站点,点右侧的「管理」→「设置」,在弹出的窗口里切到「防盗链」标签页(部分版本叫「防盗链设置」)。
切到同一窗口的「配置文件」标签页,搜索 valid_referers,你会看到面板生成的类似内容:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked www.example.com example.com;
if ($invalid_referer) { return 403; }
}
对照这段,检查三件事:自己的主域名在不在、带 www 和不带 www 是不是都写了、none blocked 是不是被删掉了。
第三步:补齐白名单,把 none 和 blocked 加回去
这一步解决 90% 的静态资源 403。在「防盗链」标签页的允许域名框里,把下面这些全部填进去,每行一个或用英文逗号分隔:
none
blocked
example.com
*.example.com
localhost
127.0.0.1
子域名多的话用 *.example.com 通配;如果站点跑在非 80/443 端口,要写成 example.com:8080 这种带端口的形式。
注意:
none(允许完全没有 Referer 的请求)和blocked(允许 Referer 被抹掉的请求)是 Nginx 的关键词,不能写成None、NULL、空,也不能加引号。
注意:
valid_referers后面只写域名,不要带http://、https://前缀,也不要带路径。写成https://example.com会匹配不上,因为 Nginx 比对的是 Referer 去掉协议后的主机名部分。
第四步:保存并重载 Nginx
这一步让配置真正生效。点「保存」后,小皮面板一般会自动重载,但为了保险,去左侧「软件商店」→ 已安装 → Nginx → 点「重载配置」。也可以 SSH 登录后手动执行:
/www/server/nginx/sbin/nginx -t
/www/server/nginx/sbin/nginx -s reload
第一条命令输出 syntax is ok 和 test is successful 才算配置没问题,有报错就别 reload。
注意:如果
nginx -t报错但你改的是面板界面,说明面板生成的配置本身有问题,回「配置文件」标签页手工检查那几行,或者直接删掉整段防盗链配置重新设置一遍。
第五步:让防盗链只拦图片视频,放行 CSS/JS/字体
这一步是可选的精细化处理。CSS、JS、字体这类资源跨域引用很常见(比如 CDN、字体图标),把它们也拦住容易出各种诡异问题,索性不设防。在「配置文件」标签页里,把防盗链的 location 改成只匹配多媒体后缀:
location ~* \.(gif|jpg|jpeg|png|webp|bmp|mp4|flv)$ {
valid_referers none blocked *.example.com example.com;
if ($invalid_referer) { return 403; }
}
保存重载后,再用第五步的 curl 命令验证:不带 Referer 拿图片返回 200,带别人的 Referer 拿图片返回 403,说明防盗链和放行都到位了。
注意:Nginx 的正则 location 按配置文件里出现的先后顺序匹配,谁写在前面谁先生效。同一份配置里不要既写一个拦全部静态资源的 location,又写一个放行 CSS/JS 的 location,否则先匹配到的那条会赢。
小结
- 静态资源 403 优先怀疑防盗链,先用
curl -I对比带与不带 Referer 的结果来定性。 - 白名单必须包含
none和blocked,否则地址栏直开、APP 内嵌、隐私模式全部被拦。 - 域名不写协议、不写路径,主域名和 www 域名都要写,带端口要写端口,子域名用
*.example.com。 - 改完一定要重载 Nginx,并用
nginx -t先验证语法。 - CSS、JS、字体建议不设防盗链,把规则限制在图片和视频后缀上,能省很多麻烦。
原文链接:https://www.gj0.com/thread-1214.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。