防盗链必须在Apache核心层拦截,需启用mod_rewrite模块、设置AllowOverride All、正确放置.htaccess文件并包含空Referer允许及协议端口兼容的域名匹配规则,否则无效。

防盗链必须在 Apache 核心层拦截,靠 PHP 读 $_SERVER['HTTP_REFERER'] 没用——请求已经进来了,带宽和解析都花了。
确认 mod_rewrite 和 .htaccess 生效前提
XAMPP 默认不启用重写模块,也不允许目录级配置覆盖。漏掉任一环节,.htaccess 规则就等于没写。
- 打开
C:\xampp\apache\conf\httpd.conf(Windows)或/opt/lampp/etc/httpd.conf(Linux),确保这行未被注释:LoadModule rewrite_module modules/mod_rewrite.so - 找到你站点所在的
<directory></directory>块(如<directory></directory>),把里面的AllowOverride None改成AllowOverride All - 改完必须通过 XAMPP 控制面板重启 Apache,否则所有改动都不生效
写对 .htaccess 路径和文件名
Windows 下直接右键新建并重命名 .htaccess,系统会吞掉开头的点,实际变成 htaccess(无扩展名)。Apache 无法识别,日志里会出现 Invalid command 'RewriteEngine'。
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
- 正确做法:用记事本「另存为」,文件名填
".htaccess"(英文双引号包裹),编码选UTF-8 无 BOM或ANSI - 规则文件必须放在资源所在目录下,比如图片放在
C:\xampp\htdocs\images\,那就把.htaccess放进去,不是根目录 - 别盲目保护所有静态资源——
.js、.css被拦会导致本地页面样式/交互异常,只针对.jpg、.png、.pdf等高带宽文件设限
防盗链规则必须兼容空 Referer 和端口
浏览器直接输地址访问、微信内嵌页、PWA 启动、HTTPS→HTTP 跳转时,Referer 都可能为空;改了端口(如 :8080)后,Referer 是 http://localhost:8080,但规则里只写了 localhost 就会匹配失败。
- 务必保留这一行:
RewriteCond %{HTTP_REFERER} !^$,允许空 Referer - 域名匹配要带协议、可选端口、子域通配,例如:
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?localhost(:[0-9]+)?/ [NC] - 如果用自定义域名(如
dev.test),需确保 hosts 已映射,且规则中域名与浏览器地址栏完全一致(含大小写、端口、协议)
用 curl 测试比浏览器 F5 更可靠
浏览器缓存、隐私策略、Referrer-Policy 设置会让 Referer 行为不稳定,F5 刷新看不出真实效果。
- 模拟盗链:
curl -H "Referer: https://evil-site.com" http://localhost/images/test.jpg,应返回403 Forbidden - 模拟合法访问:
curl -H "Referer: http://localhost/" http://localhost/images/test.jpg,应正常返回图片 - 模拟空 Referer:
curl http://localhost/images/test.jpg,也应正常返回——否则说明!^$条件漏了
多端口场景下,每个站点的 .htaccess 必须独立部署、独立适配,规则不跨端口生效;最易忽略的是 <directory></directory> 块里没开 AllowOverride All,或者正则里忘了加端口匹配。

















