Laravel home.blade.php中无法显示复制URL的可访问外链图片
问题根因
这不是Laravel框架的问题,是Instagram CDN的防盗链拦截导致的:
- Instagram的图片CDN会校验HTTP请求的
Referer字段,只要检测到请求来源是第三方站点,就会直接拒绝返回图片资源 - 直接在浏览器地址栏打开图片链接时,请求不会携带第三方站点的Referer,所以可以正常访问
可用解决方案
根据你的使用场景选择对应方案即可:
方案1:服务端代理请求(推荐用于临时展示场景)
在Laravel中新增图片代理路由,由后端发起对Instagram图片的请求,再将图片内容返回给前端,从根源绕过浏览器端的Referer校验。
路由定义代码:Route::get('/proxy/ins-image', [\App\Http\Controllers\ImageProxyController::class, 'getInsImage']);控制器对应方法代码:
public function getInsImage(Request $request) { $imgUrl = $request->query('src'); // 增加域名白名单校验,避免接口被恶意滥用 if (!str_starts_with($imgUrl, 'https://scontent-ams2-1.cdninstagram.com/')) { abort(403); } return response()->stream(function () use ($imgUrl) { $stream = fopen($imgUrl, 'r'); fpassthru($stream); fclose($stream); }, 200, [ 'Content-Type' => 'image/jpeg', 'Cache-Control' => 'max-age=86400' ]); }模板中调用方式:
<img src="{{ url('/proxy/ins-image?src=' . urlencode('https://scontent-ams2-1.cdninstagram.com/v/t51.2885-19/97566921_2973768799380412_5562195854791540736_n.jpg?stp=dst-jpg_s320x320&_nc_ht=scontent-ams2-1.cdninstagram.com&_nc_cat=104&_nc_ohc=K6wOdgtL1C4AX8vXQK-&edm=ABfd0MgBAAAA&ccb=7-5&oh=00_AT-CZthKcVgpzi71lCY9fRYyPC8kf4yq5ecZ_zeV5pG6dw&oe=62C1C25F&_nc_sid=7bff83')) }}" alt="image" height="200" width="200">方案2:图片本地化存储(推荐用于生产环境)
后端拿到Instagram图片链接后,直接将图片下载到自有存储(本地public目录、云对象存储都可),前端直接访问自有存储的图片地址。这种方案稳定性最高,不会受Instagram CDN策略调整、链接过期的影响。方案3:前端设置不携带Referer(仅适合临时测试,不推荐生产使用)
给img标签添加referrerpolicy="no-referrer"属性,告知浏览器请求图片时不携带Referer头,部分场景下可以临时绕过防盗链:<img src="https://scontent-ams2-1.cdninstagram.com/v/t51.2885-19/97566921_2973768799380412_5562195854791540736_n.jpg?stp=dst-jpg_s320x320&_nc_ht=scontent-ams2-1.cdninstagram.com&_nc_cat=104&_nc_ohc=K6wOdgtL1C4AX8vXQK-&edm=ABfd0MgBAAAA&ccb=7-5&oh=00_AT-CZthKcVgpzi71lCY9fRYyPC8kf4yq5ecZ_zeV5pG6dw&oe=62C1C25F&_nc_sid=7bff83" alt="image" height="200" width="200" referrerpolicy="no-referrer">注意:Instagram随时可能调整防盗链规则,该方案随时可能失效。
内容的提问来源于stack exchange,提问作者ProgrammerFromHolland
相关产品推荐
相关产品推荐

