Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
发布时间 - 2025-12-30 00:00:00 点击率:次图片防盗链核心是校验Referer请求头域名是否在白名单内,需通过Laravel中间件拦截/uploads/等路由请求,确保不被Nginx直接响应,并配合CDN或Nginx前置校验提升性能与兼容性。
图片防盗链的核心判断逻辑是检查 Referer 请求头
浏览器在请求图片等静态资源时,通常会带上 Referer 字段,表明来源页面的域名。如果该字段为空、缺失,或域名不在白名单内,就应拒绝响应。Laravel 本身不内置图片防盗链机制,必须通过中间件手动拦截 GET 请求并验证 Referer。
用中间件拦截 public 目录下的图片请求(如 /uploads/)
关键在于:不能让 Nginx/Apache 直接返回图片文件,否则中间件完全不生效。需确保所有图片请求都经由 Laravel 路由处理。常见做法是把图片路径统一代理到一个控制器方法,或改用 Storage::response() 动态输出。
- 把图片存放在
storage/app/public/,运行php artisan storage:link创建软链接 - 路由示例:
Route::get('/uploads/{filename}', [ImageController::class, 'show'])->middleware('check.referer'); - 不要直接访问
/storage/uploads/xxx.jpg—— 这类路径绕过 Laravel,中间件无效 - Nginx 配置中需注释或移除对
public/storage的直接静态文件服务规则(否则防盗链失效)
check.referer 中间件的具体实现要点
该中间件需提取 request()->headers->get('referer'),解析出来源域名,并与白名单比对。注意边界情况:
-
Referer可能为空(如直接在地址栏输入图片 URL、某些隐私模式、curl 默认不带)—— 应默认拒绝 - 允许空 Referer 的场景(如微信内置浏览器、部分 PWA)需显式配置开关,不建议默认开启
- 使用
parse_url($referer, PHP_URL_HOST)提取 host,避免正则误匹配(如evil.com.example.com) - 白名单建议用数组配置在
config/app.php或环境变量中,例如:IMAGE_REFERER_WHITELIST=['yourapp.com', 'localhost:8000'] - 匹配时建议转为小写并去除端口(
preg_replace('/:\d+$/', '', $host)),避免YOURAPP.COM或localhost:8000被拒
public function handle(Request $request, Closure $next)
{
$referer = $request->headers->get('referer');
if (!$referer) {
abort(403, 'Forbidden: Referer required');
}
$host = parse_url($referer, PHP_URL_HOST);
if (!$host) {
abort(403, 'Forbidden: Invalid Referer host');
}
$host = strtolower(preg_replace('/:\d+$/', '', $host));
$whitelist = config('app.image_referer_whitelist', []);
if (!in_array($host, $whitelist)) {
abort(403, 'Forbidden: Referer not allowed');
}
return $next($request);}
性能与兼容性注意事项
每次图片请求都走 PHP 和中间件,对高并发场景有压力。生产环境强烈建议结合 CDN 或 Nginx 做前置校验,只将“无法判断”的请求(如带 query 参数的缩略图)交由 Laravel 处理。
- Nginx
示例(更高效):location ~* \.(jpg|jpeg|png|gif)$ { valid_referers none blocked yourapp.com *.yourapp.com; if ($invalid_referer) { return 403; } } - CDN(如 Cloudflare、阿里云 CDN)通常支持 Referer 黑白名单规则,优先启用
- 移动端 WebView、某些小程序可能不发送 Referer,需配合 token 签名方案(如
/uploads/xxx.jpg?token=sha256(...))作为补充 - Chrome 85+ 对跨域请求默认使用
strict-origin-when-cross-origin,可能导致 Referer 被截断为 origin,需在白名单中包含完整 origin(含协议和端口)或仅比对 host
实际部署时,Referer 校验只是第一道防线;真正敏感的图片,仍需配合权限控制、临时签名 URL、水印、访问频率限制等组合策略。单靠中间件防不住抓包重放或 Referer 伪造。
# php
# laravel
# apache
# nginx
# 微信
# 浏览器
# app
# 端口
# 小程序
# curl
# 阿里云
# 路由
# 环境变量
# 中间件
# chrome
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
PHP 500报错的快速解决方法
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Mybatis 中的insertOrUpdate操作
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
简单实现Android文件上传
如何用虚拟主机快速搭建网站?详细步骤解析
太平洋网站制作公司,网络用语太平洋是什么意思?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Java解压缩zip - 解压缩多个文件或文件夹实例
Laravel怎么实现验证码(Captcha)功能
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
HTML 中动态设置元素 name 属性的正确语法详解
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
中山网站推广排名,中山信息港登录入口?
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
java ZXing生成二维码及条码实例分享
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
浅述节点的创建及常见功能的实现
Laravel如何实现用户注册和登录?(Auth脚手架指南)
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何在阿里云虚拟主机上快速搭建个人网站?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
香港服务器租用费用高吗?如何避免常见误区?
如何在Tomcat中配置并部署网站项目?
如何获取上海专业网站定制建站电话?
利用python获取某年中每个月的第一天和最后一天
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何正确选择百度移动适配建站域名?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何在自有机房高效搭建专业网站?
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
网站图片在线制作软件,怎么在图片上做链接?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Android实现代码画虚线边框背景效果
如何快速查询网址的建站时间与历史轨迹?
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法


示例(更高效):