【问题标题】:Tunelling link data through PHP?通过 PHP 隧道链接数据?
【发布时间】:2014-02-06 18:09:56
【问题描述】:

我希望能够转到mydoma.in/tunnel.php?file=http://otherdoma.in/music.mp3,然后将http://otherdoma.in/music.mp3的数据流式传输到客户端。

我尝试通过 Header(); 执行此操作,但它重定向而不是“调整”数据。

我该怎么做?

【问题讨论】:

    标签: php tunnel


    【解决方案1】:

    使用 cURL 进行流式传输:

    <?php
    
    $url = $_GET["file"];
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 256);
    
    curl_exec($ch);
    curl_close($ch);
    
    ?>
    

    【讨论】:

    • 不会先下载整个文件吗?我想这样做,同时尽可能少地保留在硬盘上。
    • 我认为每 256 个字节,它都会刷新到标准输出(在这种情况下是网络浏览器)。它不应使用超过 CURLOPT_BUFFERSIZE 字节的内存。
    • 啊,我试试这个。这听起来像是一个很好的解决方案:)
    • 好吧...小心,因为这是非常不安全的。您应该确保“文件”变量是网站。 mydoma.in/tunnel.php?file=file:///etc/passwd 将暴露代理密码文件
    • 我知道,我会添加一些协议白名单之类的。我发现了一个问题,这似乎不适用于 https 请求,我需要这个项目。有解决办法吗?
    【解决方案2】:

    如果它们很小,您也许可以使用 file_get_contents()。否则,您可能应该使用 cURL。您可能希望从获取变量“文件”中卷曲 URL。然后使用 PHP 将其保存到本地临时位置。然后,使用 header() 将自己定向到本地文件。删除临时文件是唯一的问题,因为没有办法确定您何时完成下载。因此,您可能可以休眠或延迟文件删除,但您可能会发现稍后使用 cron 作业清理所有临时文件是一个更好的选择。

    【讨论】:

      【解决方案3】:

      让您的 PHP 脚本拉取远程内容:

      $data = file_get_contents($remote_url);
      

      然后吐出来:

      echo $data;
      

      或者简单地说:

      echo file_get_contents($remote_url);
      

      您可能需要添加一些标题来指示内容类型。

      或者,您可以使用 nginx 之类的东西配置代理 - 这将允许您将特定 URL 重写到远程站点,然后将它们作为本地站点提供,无需编码。

      【讨论】:

      • 使用 file_get_contents 需要先下载整个文件,对吧?我正在寻找可以“流式传输”它的东西。 nginx 的东西看起来很有趣——我使用 nginx,我很熟悉它,但我只知道基本的配置文件。我假设我将不得不使用重写和这些代理规则,我该怎么做?
      • 是的 file_get_contents 将首先下载整个文件。提供的 nginx 链接给出了示例。我只是突出显示它以防您没有注意到它是一个链接。
      • 我明白你的意思,我只是不知道如何配置 nginx 来代理 url 中指定的 url(即 domain.com/tunnel/{URL} 将代理 {URL})。
      猜你喜欢
      • 1970-01-01
      • 2014-07-20
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2012-03-20
      • 2021-02-15
      • 2018-10-06
      相关资源
      最近更新 更多