1

我正在尝试制作一个 php“图像下载器”,到目前为止一切都按照我想要的方式进行。我面临的问题可能是我试图访问的服务器的某种安全性。例如,这个url会显示我想用我的服务器下载的图像。

但是,如果我尝试至少在我的网站中显示带有该 URL 的图像,它根本不会出现。我无法显示我网站的网址,但这只是一个简单的<img />标签。

有什么办法可以解决这个问题还是我应该退出?

PS只是为了说明我的代码没有错,我可以从我迄今为止尝试过的其他网站下载任意数量的图像。并且不要问我代码,因为即使<img src="url_here.jpg" />不起作用,所以看php代码是没有意义的。

4

1 回答 1

2

是的,它不会出现,因为其他服务器正在阻止图像的热链接。

一个典型的例子是

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yande.re/.*$ [NC]
RewriteRule \.(gif|jpg|js|css)$ - [F]

解决方案。

  • 通过 curl 加载图像
  • 保存到 CDN
  • 然后将其显示在您的网站上

概念证明

$url = 'https://yande.re/sample/2f7b6c5d87d90f173769d999e60861c8/yande.re%20250521%20sample.jpg';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31");
curl_setopt($ch, CURLOPT_REFERER, "https://yande.re");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$data = curl_exec($ch);
curl_close($ch);

// $data is file data
$post   = array('image' => base64_encode($data), 'key' => "YOUR_API_KEY_ITS_FREE");
$timeout = 30;
$curl    = curl_init();

curl_setopt($curl, CURLOPT_URL, 'http://api.imgur.com/2/upload.json');
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$json = curl_exec($curl);
curl_close ($curl);

$json = json_decode($json);
printf("<img src\"%s\" / >",$json->upload->links->small_square);

输出

在此处输入图像描述

于 2013-04-03T16:47:11.337 回答