本方法通过 Apache 的 .htaccess 规则实现图片资源防盗链,禁止外部网站非法引用图片,同时可自定义放行信任域名,支持返回 403 禁止或自定义默认提示图片。
一、适用环境与实现原理
适用于 Apache 服务器环境,通过判断 HTTP_REFERER(来源地址)识别请求是否为合法访问,仅允许本站及白名单域名加载图片,非法外链请求直接拦截。
二、完整 .htaccess 规则代码
将以下代码放置在网站根目录的 .htaccess 文件中,若无该文件可直接新建。
RewriteEngine On 针对图片、静态资源生效 RewriteCond %{REQUEST_FILENAME} .(jpg|jpeg|png|gif|bmp|webp|ico|svg)$ [NC] 放行空来源、本地访问 RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !localhost [NC] RewriteCond %{HTTP_REFERER} !127.0.0.1 [NC] 白名单放行域名(可自行添加、修改) RewriteCond %{HTTP_REFERER} !^https?://(.+.)?zhihhu.com [NC] RewriteCond %{HTTP_REFERER} !^https?://(.+.)?798game.com [NC] RewriteCond %{HTTP_REFERER} !^https?://(.+.)?baidu.com [NC] RewriteCond %{HTTP_REFERER} !^https?://(.+.)?qq.com [NC] RewriteCond %{HTTP_REFERER} !^https?://(.+.)?weixin.qq.com [NC] 拦截非法外链,返回 403 禁止 RewriteRule ^(.*)$ - [F,L] 可选:替换为显示默认提示图片 RewriteRule ^(.*)$ /images/no-hotlink.png [L]
三、规则配置说明
1. 开启重写引擎
首先必须启用 RewriteEngine,否则所有重写规则均不生效。
RewriteEngine On
2. 匹配图片资源类型
指定需要防盗链的文件后缀,可根据需求增删格式,NC 表示不区分大小写。
RewriteCond %{REQUEST_FILENAME} .(jpg|jpeg|png|gif|bmp|webp|ico|svg)$ [NC]
3. 放行本地与空来源访问
避免本地访问、浏览器不携带来源信息时出现图片无法加载的问题。
RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !localhost [NC] RewriteCond %{HTTP_REFERER} !127.0.0.1 [NC]
4. 设置信任域名白名单
添加允许外链的域名,支持主域名及所有子域名,复制行即可新增多个放行地址。
RewriteCond %{HTTP_REFERER} !^https?://(.+.)?允许的域名.com [NC]
5. 外链拦截处理方式
提供两种处理方式,二选一使用:
方式一:直接返回 403 禁止访问(推荐,节省服务器资源)
RewriteRule ^(.*)$ - [F,L]
方式二:显示自定义提示图片,需提前上传图片至服务器对应路径
RewriteRule ^(.*)$ /images/no-hotlink.png [L]
四、使用与注意事项
1. 代码需放置在网站根目录 .htaccess 文件中;
2. 修改白名单域名时,注意域名前的转义符 . 不可省略;
3. 若部分正常访问出现异常,可检查是否放行对应域名;
4. 仅适用于 Apache 服务器,Nginx 环境需使用对应配置规则。
实用可复制的代码:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} \.(jpg|jpeg|png|gif|bmp|webp|ico|svg|js)$ [NC] RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !localhost [NC] RewriteCond %{HTTP_REFERER} !127.0.0.1 [NC] RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?zhihhu\.com [NC] RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?798game\.com [NC] RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?baidu\.com [NC] RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?qq\.com [NC] RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?weixin\.qq\.com [NC] RewriteRule ^(.*)$ - [F,L]
