php nginx代理远程文件下载

php nginx代理远程文件下载,php,nginx,Php,Nginx,我想“代理”一个位于远程服务器(我们称之为服务器B)上的文件,并强制将其从服务器a下载给访问者 只有服务器A可以访问服务器B上的ressource(IP地址受保护)。ressource的重量可达几GB 以下是我目前的代码: header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.$filename); header('Content-Transfer

我想“代理”一个位于远程服务器(我们称之为服务器B)上的文件,并强制将其从服务器a下载给访问者

只有服务器A可以访问服务器B上的ressource(IP地址受保护)。ressource的重量可达几GB

以下是我目前的代码:

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Transfer-Encoding: chunked'); 
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
$stream = fopen('php://output', 'w');
$ch = curl_init($ruri);
curl_setopt($ch, CURLOPT_READFUNCTION, function($ch, $fd, $length) use ($stream) {
    return fwrite($stream, fread($fd, $length));
});
curl_exec($ch);
curl_close($ch);
它部分起作用

问题1:

  • 访问者在下载ressource时无法浏览服务器A上的任何网站页面。为什么?
问题2:

  • 它不支持暂停或恢复下载。显然,我可以使用“范围”标题来解决它。我还没有尝试,因为“问题1”是一个大问题,我想先解决它,然后再朝这个方向进一步
请注意:

  • 我不希望ressource在提供给访问者之前完全下载到服务器A的磁盘上,我希望它直接“转发”给访问者(也称为“代理”)
  • 我读过关于readfile()和file_get_content()的帖子,我试过,同样的问题。甚至没有提到这些功能对服务器A(CPU、内存)造成了多大的压力,尤其是对于大文件
  • 难道没有更有效的方法吗?我的意思是没有PHP,而是通过Apache或Nginx