【发布时间】:2012-05-16 11:23:11
【问题描述】:
我正在制作一个 PHP 图像代理脚本。我不仅需要它来回显它请求的图像的内容,而且还需要同样地再现图像请求的标头。
我见过一个,另一个,但没有同时看到......这些 cURL 选项让我感到困惑。我该怎么做?
【问题讨论】:
标签: php image curl proxy header
我正在制作一个 PHP 图像代理脚本。我不仅需要它来回显它请求的图像的内容,而且还需要同样地再现图像请求的标头。
我见过一个,另一个,但没有同时看到......这些 cURL 选项让我感到困惑。我该怎么做?
【问题讨论】:
标签: php image curl proxy header
抱歉,我不确定你想要什么。
这是从图像 url 获取、回显标题并将图像保存到文件的示例。
但是,如果你想要一个代理,你应该使用网络服务器(Nginx,Apache等),PHP是没有必要的
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://img3.cache.netease.com/www/logo/logo_png.png");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER, "http://www.163.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$return = curl_exec($ch);
curl_close($ch);
list($header, $image) = explode("\r\n\r\n", $return, 2);
echo $header;
file_put_contents("/tmp/logo.png", $image);
【讨论】:
您可以使用getallheaders() 获取所有标题(不是原始文本)
然后将它们串在一起:
$headers = "";
foreach (getallheaders() as $name => $value) {
$headers = "$name: $value\r\n";
}
$headers .= "\r\n"; // Double newline to signal end of headers (HTTP spec)
那么我认为最好的方法是使用套接字连接,而不是像这样的 CURL:
$response = '';
$fp = fsockopen('example.org', 80);
fputs($fp, $headers);
while (!feof($fp)) {
$response .= fgets($fp, 128);
}
fclose($fp);
请注意,您可能需要修改主机/请求标头(因为这是一个相同的副本,正如您所要求的那样),并且您可能需要实现重定向跟踪。
【讨论】: