图片地址单独粘到浏览器里能打开,文件也确实躺在服务器上,可页面一刷新全是裂图——这种网站打开图片显示不出来的情况,我碰过的十有八九是防盗链把自己人拦了。剩下那一两成也不复杂,要么图压根没传上去,要么是 HTTPS 页面引了 HTTP 的图被浏览器掐掉。先别急着换主机,也别急着骂服务商,按顺序走一遍,多数能当场定位。

网站打开图片显示不出来,先分清是“被拦”还是“没找到”
按 F12 调出开发者工具,切到 Network 面板,刷新页面,盯着那张裂图看状态码。403 基本就是权限或者防盗链;404 是路径错了、文件名大小写对不上(Linux 上 Image.JPG 和 image.jpg 是两个完全不同的文件),或者图片根本没跟着站点一起搬过来;状态 200 但屏幕上还是不显示,那多半是格式问题或者混合内容被拦。这一步花不了两分钟,能省掉后面一堆瞎猜。顺手看一眼响应头里的 Server,也能知道这图是从主站出的,还是从 CDN 那边出的,后面的排查方向完全不一样。
防盗链防的到底是什么
原理说穿了不值得写一篇文章:浏览器请求图片时会带上 Referer 头,告诉服务器“我是从哪个页面过来的”。服务器一看来源不在白名单里,就返回 403,或者甩一张“禁止外链”的占位图。带宽是按流量计费的,一张图被别的站盗去当背景,钱是你在掏,所以这功能本身没毛病,毛病都出在白名单写得太随意。我见过最多的三个翻车场景:新站换了域名,白名单里还挂着老域名;主站 www 加了,移动端那个 m 忘了加;图片单独放了台服务器或者挂了 CDN,结果自己主域反而没写进去。换域名那阵子最容易出这种事,页面文字全正常,就图片一片一片地裂,看着像数据库炸了,其实就一行配置。
空 Referer 和 HTTPS 降级,两个最容易被忽略的坑
空 Referer 这事很多人不知道。用户直接在地址栏粘图片地址打开、从收藏夹进、或者某些 App 的内置浏览器,请求里压根不带 Referer。规则里如果没放行空来源(Nginx 里就是 none 这个参数),这些正常访问全被当成盗链处理。反过来只写 none 也有风险,等于谁都能盗,白名单还是得把自己的几个域名写全。另一个坑是 HTTPS 页面里去引 HTTP 的图片,浏览器按策略不发 Referer,服务端收到的就是空来源,一样被拦。还有一种更隐蔽的:页面 head 里被人塞了 <meta name=”referrer” content=”no-referrer”>,全站请求都不带来源,自家的防盗链把自家整站拦掉。这种查起来最磨人,因为你会默认“我自己的站怎么会拦自己”,然后一路往 DNS、往存储、往程序上找,全找错方向。
别把 CDN 的时间戳鉴权和防盗链搞混
有些图不是被 Referer 拦的,是被 URL 鉴权拦的。CDN 和对象存储上常开一种按时间戳签名的防盗链,链接里带着有效期,到点就 403。特征很明显:页面刚上线时图是好的,过一阵子、或者链接被人转发出去以后就集体裂开。这种要去控制台看鉴权配置,改法无非是把有效期放长一点,或者把这类静态图从鉴权里摘出来,换成 Referer 白名单。对象存储那边如果桶是私有读,所有直链都得带签名,中间哪个环节漏了签名就是 403。各家控制台的字段名不一样,具体口径以服务商官方页面说明为准,别照搬别人博客里的截图。
服务器和面板上的改法
Nginx 里的标准写法大概是 location ~* \.(jpg|jpeg|png|gif|webp)$ { valid_referers none blocked server_names *.example.com example.com; if ($invalid_referer) { return 403; } } 这样。blocked 是放行被防火墙或代理改写过的来源,server_names 就是本机配置里那些域名。Apache 用 SetEnvIfNoCase Referer 能做到同样的判断。用宝塔或者虚拟主机控制面板的,一般有个防盗链开关加白名单输入框,填的时候带 www 和不带 www 的都写上,别嫌麻烦,就多打几个字。改完记得清一下 CDN 缓存再测,不然你看到的还是旧结果,来回折腾半天以为没生效。
一张能照着走的排查清单
第一,F12 看状态码,403 往防盗链方向走,404 往路径方向走,两者别混。第二,确认图片地址是主站域名还是 CDN 域名,去对应的控制台看白名单和鉴权。第三,用命令行带上 Referer 试一次,curl -I -e “https://www.example.com/” 图片地址,回 200 说明规则没问题,回 403 就是白名单没写对。第四,翻一遍页面模板,看有没有 no-referrer 这类 meta 标签。第五,确认是不是 HTTPS 页面引了 HTTP 的图。第六,换个浏览器、把广告拦截插件关掉再刷一次,文件名里带 ad、banner 的图被插件误杀这种事,一年总能遇上几回。
防盗链配好了省带宽,配歪了就是自己给自己添堵。真要临时救急,先把防盗链开关整个关掉,确认问题到底是不是它,再一点点把白名单补全,比对着文档猜快得多。另外提一句,图片文件名尽量别用中文和空格,搬家换服务器的时候最容易在这种小地方掉链子。改完别只在电脑浏览器上看一眼就完事,手机端和微信里都点开试试,那几个场景带的 Referer 跟桌面浏览器真不一样。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!