我有一个mod_rewrite
规则,将发送任何子域请求到一个PHP脚本,应该代理这些请求到另一个主机(内部代理,而不是302)。PHP:代理另一个网址
我很近,在我的脚本与Web浏览器的工作原理,但似乎袅袅不喜欢它:
curl: (56) Received problem 2 in the chunky parser
这里是我的mod_rewrite:
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);
任何理由为什么卷曲不喜欢这个,但浏览器可以吗?
编辑:看来,如果我不发送Transfer-Encoding: chunked
标题,一切都OK(因为我代理完整的请求,分块是不可能的)。因此,后续问题:我可以充当真正的中间人,并通过套接字发送数据吗?