获取在PHP中重定向的远程映像

时间:2011-03-10 19:37:44

标签: php javascript image http redirect

我正在尝试从PHP中获取并显示来自URL的远程图像。大多数图像都有效,但有些图像重定向,例如:

http://thundafunda.com/33/World-tour/download/Grand%20Canal,%20Venice,%20Italy%20pictures.jpg

图像会加载然后消失。我正在使用IMG标记并将该URL作为源。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

使用这部分代码,除了显示<img>标记外,它不会执行任何操作:

$url = 'http://thundafunda.com/33/World-tour/download/Grand%20Canal,%20Venice,%20Italy%20pictures.jpg';
echo '<img src="' . $url . '" alt="" />';

我得到了您描述的相同行为:图片未显示。


如果我看一下网络级别上发生的事情,使用Firebug,我看到了:

http://extern.pascal-martin.fr/so/5264918.png

基本上:

  • 请求加载图片
  • 图片加载
  • 但回应是:
    • 一个302 HTTP状态代码
    • 重定向到响应的Location标题中指定的网址 - 指向HTML网页
  • 因此,浏览器遵循该重定向
  • 并加载HTML页面

当然,这不能在<img>标记中显示。



如果您执行完全相同的测试,禁用Referer (某些Firefox扩展程序可以执行此操作),您将看到图像正确显示 - 和Firebug说:

http://extern.pascal-martin.fr/so/5264918-2.png

请注意,这次,我的浏览器发送的请求中没有Referer标头。


考虑到这一点,我敢打赌,有一种反热链接保护,这是由托管该图像的网站设置的......

除了在您自己的服务器上托管文件外,您无能为力 - 如果许可证允许您这样做。

答案 1 :(得分:1)

服务器可能会阻止图像的热链接,可能是基于引荐来源。有很多方法可以解决这个问题,例如使用curl(如果安装在服务器上):

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://thundafunda.com/33/World-tour/download/Grand%20Canal,%20Venice,%20Italy%20pictures.jpg');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, 'http://thundafunda.com/');
$imageData = curl_exec($ch);

header("Pragma: public"); // required 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: image/jpg"); 
header("Content-Transfer-Encoding: binary"); 
echo $imageData;

<强>声明:

他们可能不喜欢图像的热链接,否则他们不会首先集成他们的解决方案。更好地要求他们使用他们的图像的权限,否则可能会侵犯他们的版权