开启防盗链后,站内下载页点按钮返回 403,直接在地址栏打开反而正常,Nginx 日志里记录 Referer 是空字符串。日志里能对上时间点,这种反而好排。

规则写成 Referer 不匹配本站就拒绝,空 Referer 也被算作不匹配。部分浏览器隐私模式和对下载请求不发 Referer,站内点击同样中招。这一点先确认清楚,后面就不用反复试。

valid_referers none blocked server_names *.example.com;
if ( $invalid_referer ) { return 403; }

这次卡住的地方就在「防盗链 Referer 判断」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:白名单放行空 Referer,只拦明确来自外站的请求;把本站域名和子域名都加进 valid_referers;从站内按钮、地址栏、外站链接三种入口各测一次。

结果对不对很好判断,站内点击下载正常返回 200,外站嵌入的链接仍然 403。

作者 9823189