我的PHP应用程序有时需要从上游(传统)HTTP后端反向代理一些内容。
我可以使用Curl模块来实现这一点,这使我能够很好地控制后端请求标头和内容(例如发布一些内容),但我无法弄清楚如何将响应流回来,包括相关的回复标题。
例如,我的PHP应用程序需要将一些JSON发布到后端,这将生成一个大的zip文件。如何将zip文件流回客户端而不进行缓存,包括Content-Type
和Content-Disposition
标头,其中包含文件类型,最重要的是文件名?
如果我取消设置CURLOPT_RETURNTRANSFER
,则后端响应会正确流式传输,但不会显示标头。如果我另外设置CURLOPT_HEADER
,后端标头也会被传递,但是客户端会获得HTTP标头的两个副本(一个来自PHP,另一个来自Curl。)
另一方面,如果我设置CURLOPT_RETURNTRANSFER
,那么我必须将响应缓存在某个地方(在内存或临时文件中),这是次优的。
这个问题有解决方法吗?
答案 0 :(得分:0)
解决方案是使用CURLOPT_HEADERFUNCTION
,确保返回每个标头消耗的字节数,无论是否输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($ch, $header) {
if (preg_match('/^Content-(Disposition|Type):.*/', $header)) {
header($header);
}
return strlen($header);
});