thinkphp网站防盗链可采用nginx referer白名单、thinkphp路由层鉴权或nginx secure link签名三种方案:第一种简单高效,仅允许可信来源访问;第二种支持动态校验与登录态判断;第三种通过时效性签名url彻底杜绝盗链。

如果您在使用ThinkPHP构建的网站中发现图片等静态资源被其他网站直接引用,导致带宽异常升高或版权内容被滥用,则很可能是遭遇了盗链行为。Nginx可通过校验HTTP Referer字段对ThinkPHP项目中的图片资源实施有效防护。以下是具体配置步骤:
一、基于Referer白名单的防盗链配置
该方法利用Nginx内置的ngx_http_referer_module模块,仅允许指定来源(如本域、空Referer、可信合作域名)访问图片资源,非法请求返回403错误。适用于绝大多数ThinkPHP部署场景,无需修改PHP代码。
1、打开Nginx站点配置文件(通常位于/etc/nginx/conf.d/your-site.conf或/usr/local/nginx/conf/vhost/xxx.conf)。
2、在server块内添加如下location规则,匹配ThinkPHP默认静态资源路径(如public/static或public/uploads)及常见图片后缀:
3、插入以下配置段(请将yourdomain.com替换为实际域名):
location ~* ^/(static|uploads)/.*\.(jpg|jpeg|png|gif|bmp|webp)$ {
valid_referers none blocked server_names *.yourdomain.com yourdomain.com;
if ($invalid_referer) {
return 403;
}
expires 1d;
add_header Cache-Control "public, no-transform";
}
4、确认该location块位于ThinkPHP对应的server块中,且未被其他location规则覆盖。
5、执行语法检查:nginx -t。
6、重载配置:nginx -s reload。
二、结合ThinkPHP路由的精准防盗链控制
该方法将防盗链逻辑下沉至ThinkPHP应用层,通过Nginx将图片请求代理至PHP脚本统一鉴权,可支持动态白名单、用户登录态校验、Referer+Token双重验证等复杂策略,避免单纯依赖Referer的可伪造缺陷。
1、在ThinkPHP的app/controller下新建Resource.php控制器,实现图片读取与Referer校验逻辑。
2、在Nginx配置中新增location,将匹配到的图片请求交由PHP处理:
location ~* ^/(static|uploads)/.*\.(jpg|jpeg|png|gif|bmp|webp)$ {
try_files $uri @php_resource;
}
3、在同级server块中定义@php_resource命名位置块:
location @php_resource {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 300;
}
4、确保ThinkPHP的index.php能正确解析PATH_INFO并路由至Resource控制器。
5、在Resource控制器中,使用$_SERVER['HTTP_REFERER']获取来源,并比对预设白名单数组;校验失败时返回403响应头并终止输出。
三、启用URL签名机制(Secure Link)
该方法通过Nginx的ngx_http_secure_link_module模块对图片URL进行MD5签名与时效控制,生成一次性、有时限的访问链接,彻底杜绝长期盗链可能,适合高安全要求的ThinkPHP资源分发场景。
1、确认Nginx已启用secure_link模块:执行nginx -V 2>&1 | grep -o with-http_secure_link_module,有输出即表示支持。
2、在server块中添加如下配置:
location /protected/ {
secure_link $arg_st,$arg_e;
secure_link_md5 "your_secret_key$uri$arg_e";
if ($secure_link = "") { return 403; }
if ($secure_link = "0") { return 410; }
alias /path/to/thinkphp/public/uploads/;
}
3、在ThinkPHP中编写PHP函数生成签名URL,例如:
$secret = 'your_secret_key';
$uri = '/protected/photo.jpg';
$expire = time() + 3600; // 1小时有效期
$md5 = base64_encode(md5($secret . $uri . $expire, true));
$md5 = strtr($md5, '+/', '-_');
$md5 = rtrim($md5, '=');
$url = "https://yourdomain.com{$uri}?st={$md5}&e={$expire}";
4、前端页面中所有图片src均替换为此类动态生成的签名URL。
5、重启Nginx使配置生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











