【问题标题】:PHP cURL proxy WITH header?带有标头的PHP cURL代理?
【发布时间】:2012-05-16 11:23:11
【问题描述】:

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

我见过一个,另一个,但没有同时看到......这些 cURL 选项让我感到困惑。我该怎么做?

【问题讨论】:

    标签: php image curl proxy header


    【解决方案1】:

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

    这是从图像 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);
    

    【讨论】:

    • 不得不更改很多代码,但它正是我需要自己解决的问题。非常感谢!你救了我:D
    • 看在上帝的份上,请解释一下你必须从谷歌获取 PHP CURL 代理图像的原因,你没有说明为什么它的一部分对你有用
    【解决方案2】:

    您可以使用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);
    

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

    【讨论】:

    • 他从他代理到后端的请求中询问标头。例如代理请求。 getallheaders 将提供来自调用者的请求标头,而不是那些与后端调用有关的标头。最重要的是 getallheaders() 在 5.4.0 之前的所有平台上也不支持,比如值得注意的 php-cgi(只有 apache 和一些),所以如果你在 nginx 上,你需要做一些技巧。
    猜你喜欢
    • 2023-03-15
    • 2019-06-21
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2015-12-15
    • 2012-04-03
    • 2018-04-03
    • 2013-08-03
    相关资源
    最近更新 更多