Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:代理另一个url_Php_Proxy_Curl - Fatal编程技术网

PHP:代理另一个url

PHP:代理另一个url,php,proxy,curl,Php,Proxy,Curl,我有一个mod_rewrite规则,它将向php脚本发送任何子域请求,php脚本应该将这些请求代理给另一个主机(内部代理,而不是302) 我很接近,因为我的脚本可以与web浏览器一起工作,但curl似乎不是这样: curl: (56) Received problem 2 in the chunky parser 这是我的修改: RewriteCond %{HTTP_HOST} ^(.*)\.example\.com$ RewriteRule ^.*$ %{DOCUMENT_ROOT}/pro

我有一个
mod_rewrite
规则,它将向php脚本发送任何子域请求,php脚本应该将这些请求代理给另一个主机(内部代理,而不是302)

我很接近,因为我的脚本可以与web浏览器一起工作,但curl似乎不是这样:

curl: (56) Received problem 2 in the chunky parser
这是我的修改:

RewriteCond %{HTTP_HOST} ^(.*)\.example\.com$
RewriteRule ^.*$ %{DOCUMENT_ROOT}/proxy.php?__path=%1 [QSA,L]
还有我的
proxy.php

<?php

$name = $_GET['__path'];
unset($_GET['__path']);
$path = $_SERVER['REQUEST_URI'];

$url = "http://$name.internal.example.com$path";
$ch = curl_init($url);
$headers = array();
foreach (apache_request_headers() as $key => $value) {
    $headers[] = "$key: $value";
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $_SERVER['REQUEST_METHOD']);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
curl_setopt($ch, CURLOPT_HEADER, TRUE);  

$data = curl_exec($ch);

list($headers, $body) = explode("\r\n\r\n", $data, 2);
$headers = explode("\r\n", $headers);
foreach ($headers as $header) {
    header($header);
}
die($body);

是的,您应该能够在获取数据时通过网络发送数据。但我怀疑您的问题可能源于持久的http连接。HTTP 1.0将在请求后断开连接,在代码中为每个请求创建一个新的CURL句柄,它更像HTTP/1.0,而不是默认的HTTP/1.1

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
您可能仍然会遇到应用程序层的问题,因为CURL并不打算像这样充当代理。另一种方法是修改现有请求,并确保转发的请求足够接近您的需要

无论您使用何种方法,我强烈建议您使用WireShark进行调试。然后,您可以转储2个http请求,然后使用类似的方法找出差异