У меня есть a mod_rewrite
правило, которое отправит любые запросы субдомена к сценарию PHP, который должен проксировать те запросы к другому хосту (внутренний прокси, не 302).
Я близок, в котором мой сценарий работает с веб-браузерами, но завихрение не походит на него:
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
заголовок, все в порядке (так как я проксирую полный запрос, разделение на блоки не возможно). Так развить вопрос: я могу действовать как истинный посредник и отправить данные, поскольку я получаю их по сокету?
Да, вы должны иметь возможность отправлять данные через сеть, как вы ее понимаете. Но я подозреваю, что ваша проблема может быть связана с постоянными HTTP-соединениями. HTTP 1.0 разорвет соединение после запроса, в вашем коде вы создаете новый дескриптор CURL для каждого запроса, который больше похож на HTTP / 1.0, а не на HTTP / 1.1 по умолчанию
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
У вас все еще могут быть проблемы с уровнем приложения потому что CURL не предназначен для работы в качестве такого прокси. Другой подход - изменить существующий PHP HTTP-клиент и убедиться, что перенаправленные запросы достаточно близки для ваших нужд.
Независимо от того, какой подход вы используете, я настоятельно рекомендую использовать WireShark для отладки. Затем вы можете выгрузить 2 HTTP-запроса, а затем использовать что-то вроде Meld , чтобы выявить различия.