使用cURL下载AWS存储的摄像头图片时遭遇Access Denied问题
解决cURL访问摄像头图片返回Access Denied的问题
我来帮你搞定这个问题——你碰到的Access Denied,大概率是目标服务器做了请求头校验。很多公共资源网站会检查请求的User-Agent、Referer这类字段,判断请求是否来自合法的浏览器环境,而默认的cURL请求不带这些头,自然会被拒绝。
先看你的代码,默认的cURL请求标识是curl/[版本号],一眼就能被识别为非浏览器请求,我们只需要添加必要的请求头模拟浏览器访问就行。
修改后的可运行代码
<?php $url = 'http://s3-us-west-2.amazonaws.com/alertwildfire-data-public/Axis-CupertinoHills/latest_full.jpg'; $ch = curl_init(); // 模拟浏览器的请求头,让服务器认为是合法访问 $headers = [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer: http://www.alertwildfire.org/index.html' // 带上原页面的来源标识 ]; curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 注入请求头 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动处理可能的重定向 $data = curl_exec($ch); // 新增错误排查逻辑,方便后续调试 if(curl_errno($ch)) { echo 'Curl请求错误: ' . curl_error($ch); exit; } header('Content-type: image/jpeg'); echo $data; curl_close($ch); ?>
关键修改点说明
- 添加
User-Agent头:模拟主流浏览器的身份标识,让服务器认为这是正常的浏览器请求 - 添加
Referer头:告诉服务器这个请求来自alertwildfire的官方页面,符合资源的访问上下文 - 开启
CURLOPT_FOLLOWLOCATION:如果目标URL存在重定向,cURL会自动跟随跳转,避免因重定向导致的访问失败
你也可以先在命令行用cURL测试验证,确认头设置有效:
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" -H "Referer: http://www.alertwildfire.org/index.html" http://s3-us-west-2.amazonaws.com/alertwildfire-data-public/Axis-CupertinoHills/latest_full.jpg -o test.jpg
如果能成功下载test.jpg,说明头设置没问题,放到PHP代码里就能正常运行了。
内容的提问来源于stack exchange,提问作者Andy Bajka
相关产品推荐
相关产品推荐

