2

我正在制作一个 PHP 图像代理脚本。我不仅需要它来回显它请求的图像的内容,而且还需要同样地再现图像请求的标头。

我见过一个,另一个,但不是两者都在一起......这些 cURL 选项让我感到困惑。我该怎么做?

4

2 回答 2

1

抱歉,我不确定你想要什么。

这是从图像 url、echo 标头获取并将图像保存到文件的示例。

但是,如果你想要一个代理,你应该使用网络服务器(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);
于 2012-05-08T02:47:26.820 回答
-1

您可以使用以下方式获取所有标题(不是原始文本)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);

请注意,您可能需要修改主机/请求标头(因为这是一个相同的副本,正如您所要求的那样),并且您可能需要实现重定向跟踪。

于 2012-05-08T01:02:44.797 回答