PHP实现QR码下载功能后preloader预加载器持续加载问题排查
问题原因
- 你绑定的页面跳转逻辑将下载链接判定为普通页面跳转:
pageTransition的conditions校验规则没有排除下载链接,点击下载按钮时,脚本认为你要跳转页面,执行onTransitionStart逻辑移除了预加载器的loaded类,触发预加载器显示。 - 下载请求不会触发页面跳转:你后端返回的响应头带
Content-disposition: attachment,只会触发浏览器下载行为,不会刷新或跳转当前页面,因此跳转逻辑的onReady回调永远不会执行,无法给预加载器加回loaded类,导致预加载器一直处于加载状态。
解决方法
方案1:给下载链接添加排除标识(推荐)
给下载的<a>标签新增自定义属性作为排除标记,示例代码:
<a id="download" href="download_qr_code.php?url=<?=encodeURIComponent($row["QR"])?>" data-preloader-skip="true"> <i title="Download" class="fa fa-download fa-4x" aria-hidden="true"></i> </a>
修改预加载器的conditions判断逻辑,新增对该属性的校验:
conditions: function (event, link) { return link && !/(\#|javascript:void\(0\)|callto:|tel:|mailto:|:\/\/)/.test(link) && !event.currentTarget.hasAttribute('data-lightgallery') && !event.currentTarget.hasAttribute('data-preloader-skip'); // 新增排除规则 }
方案2:修改正则规则直接排除下载路径
直接在正则里匹配下载接口的路径,无需修改HTML代码:
conditions: function (event, link) { return link && !/(\#|javascript:void\(0\)|callto:|tel:|mailto:|:\/\/|download_qr_code\.php)/.test(link) && !event.currentTarget.hasAttribute('data-lightgallery'); }
额外安全提示
你当前的下载接口存在任意文件读取漏洞:直接读取$_GET['url']传入的路径没有做校验,攻击者可以构造路径遍历的参数读取服务器任意敏感文件。建议添加校验逻辑,限制仅允许读取指定目录下的QR码图片,比如校验url前缀是否为你站点的QR码存储路径,或者限制仅能读取合法的图片后缀文件。
内容的提问来源于stack exchange,提问作者user12545009
相关产品推荐
相关产品推荐

